21046


ナビゲーションバーに「編集ボタン」をコードで配置すると、  
編集モードでは「完了」  
通常モードでは「編集」とボタンに表示されるかと思います。

[code]

    self.navigationItem.rightBarButtonItem = editButtonItem()
    
[/code]

一方、Storyboard上で「Bar Button Item」を配置し「System
Item」プロパティを「Edit」に変更したボタンはボタンの表示が「完了」に変わりません。

質問は２つあります。  
1.ボタンの文字を変更する方法を教えてください。  
2.今現在は編集ボタンに関してのみ差異（コードで配置する場合とSB上で配置する場合での差異）に気づきましたが、他にも挙動で違いがあるものでしょうか？

画面レイアウトに関する部分は可能な限りSB上で設定ができれば開発効率が良いかなと思っていたのですが…  
コードでセットする方が安心かな〜と思い始めました^^;


CC BY-SA 3.0
2016-01-18T11:34:31.143
21035
2016-01-19T02:06:55.437
13962
question
xcode storyboard navigationbar
(Bar Button Item) コードで配置した場合とStoryboard上で配置した場合の違い


  1. ボタンの文字を変更する方法  
Storyboard上から追加するデフォルトのBar Button Itemでは自動で「Edit→Done」のように  
**文字を変更することはできない** と思います。  
  
Storyboardから追加できるBar Button Itemは`UIBarButtonItem`です。  
System Itemプロパティは  
UIBarButtonItemの`initWithBarButtonSystemItem:target:action:`に該当します。  
このメソッドの引数のSystem Itemは  
iOSデフォルトのボタンの **デザインの設定** を意味します。  
  
※Referenceに詳細が書かれています。  
[UIBarButtonItem Class Reference:
initWithBarButtonSystemItem:target:action:](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIBarButtonItem_Class/#//apple_ref/occ/instm/UIBarButtonItem/initWithBarButtonSystemItem:target:action:)  
[UIBarButtonItem Class Reference:
UIBarButtonSystemItem](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIBarButtonItem_Class/#//apple_ref/swift/enum/c:@E@UIBarButtonSystemItem)  
  
もし、Storyboard上で配置したいのであれば、  
**UIBarButtonItemをカスタム化** することが考えられます。  
つまり、UIBarButtonItemを継承して、文字変更メソッドを追加したクラスを作成し、  
Storyboard上で追加したUIBarButtonItemのCustom Classにそれを設定する方法です。

  2. 「Storyboardから追加するBar Button Item」と「editButtonItem()」の違いについて  
`editButtonItem()`が何かと言うと、  
Edit/Doneの切換えが可能なカスタム`UIBarButtonItem`を返すメソッドを追加した  
`UIViewController`の拡張機能です。  
実際に`UIViewController`の中身を見てみると、次のように定義されています。

extension UIViewController {

[code]     public var editing: Bool

    public func setEditing(editing: Bool, animated: Bool) // Updates the appearance of the Edit|Done button item as necessary. Clients who override it must call super first.
    
    public func editButtonItem() -> UIBarButtonItem // Return an Edit|Done button that can be used as a navigation item's custom view. Default action toggles the editing state with animation.
    
[/code]

}  
  
編集ボタンだけでなく、`UINavigationController`を使うときなど、  
どうしてもStoryboardだけで収まらなくなることは多々あると思います。  
  
なので、1ではカスタム化といった方法を書きましたが、  
個人的には **Storyboardとコードをうまく活用し合う** のが良いと思います。

少しでも参考になれば幸いです。


CC BY-SA 3.0
2016-01-19T02:06:55.437
21046
2016-01-19T02:06:55.437
8968
21035
answer