2016-04-03 11 views
3

私はUINavigationControllerを持っており、アプリの状態によって右上隅にあるUIBarButtonItemが変更されます。UIBarButtonItemのUIButtonがナビゲーションバーに表示されないのはなぜですか?

ビューがロードをしたとき、私は私が

var editBarButton: UIBarButtonItem! 
var logoutBarButton: UIBarButtonItem! 
var showRepositoryBarButton: UIBarButtonItem! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    editButton = UIButton() 
    editButton.setImage(UIImage(named: "icon pencil"), forState: .Normal) 
    editButton.frame = CGRectMake(0, 0, 30, 30) 
    editButton.addTarget(self, action: #selector(UserProfileNavigatorController.onEditClick), forControlEvents: .TouchUpInside) 
    editBarButton = UIBarButtonItem(customView: editButton) 

    let logoutButton = UIButton() 
    logoutButton.setImage(UIImage(named: "icon logout"), forState: .Normal) 
    logoutButton.frame = CGRectMake(0, 0, 30, 30) 
    logoutButton.addTarget(self, action: #selector(UserProfileNavigatorController.onLogoutClick), forControlEvents: .TouchUpInside) 
    logoutBarButton = UIBarButtonItem(customView: logoutButton) 

    let showRepositoryButton = UIButton() 
    logoutButton.setImage(UIImage(named: "icon logout"), forState: .Normal) 
    logoutButton.frame = CGRectMake(0, 0, 30, 30) 
    logoutButton.addTarget(self, action: #selector(UserProfileNavigatorController.onShowRepositoryOnWebClick), forControlEvents: .TouchUpInside) 
    showRepositoryBarButton = UIBarButtonItem(customView: showRepositoryButton) 

    presenter.viewDidLoad() 
} 

を必要とするボタンを初期化し、状況に応じて、私はこのコードが実際に実行されていても、このよう

func showUserProfile() { 
    navigationItem.setRightBarButtonItems([editBarButton, logoutBarButton], animated: false) 
    Router.showUserProfileInNavigatorController(self) 
} 

func showRepository(repository: Repository) { 
    navigationItem.setRightBarButtonItems([showRepositoryBarButton], animated: false) 
    Router.showRepository(self, repository: repository) 
} 

に表示されるボタンを変更、右上隅には何も表示されません。

+0

もう少しコードを投稿できますか?私。 viewDid/WillAppearとshowUserProfileなどを呼び出す場所 –

答えて

1

問題は、そのコードがUINavigationControllerで走っていたということでした。代わりに、UINavigationControllerにボタンを表示する必要があるのはUIViewControllerです。

UIViewControllerのコードを移動するだけです。

+0

さて、showRepositoryButtonは表示されませんでした。これは、私が下で指摘したバグでした。本当に驚いていても、私の長くて詳細な答えに感謝しています... –

+1

@DavidH申し訳ありませんが、私は失礼であるようです。あなたのソリューションは実際には機能しませんでしたが、別のバグを正しく指摘しました。とにかく、ありがとう。 –

0

コードには複数の問題があることに注意してください。まず、UIButton()はオプションではないを返しますが、UIImageは任意の値を返す可能性があることに注意してください。実際にあなたのイメージの名前を実際に正しく入力したかどうかは今は分かりません。上記のコードを使用して単純なプロジェクトを作成しました。イメージはありません。イメージがない場合は何も表示されません。

イメージを追加すると、2つのイメージしか表示されません。あなたのコードを注意深く見ると、3番目の画像はloginButtonを再定義しますが、showRepositoryButtonにはプロパティを設定しません。

いくつかの提案:

  • 私たちは、指定イニシャライザ(UIButton(タイプを使用し、UIButtonを使用している場合
  • 意図しない変数の再利用を避けるために、サブコンテキストを作成するには、「{...}やります」 :...)
  • 適切なタイミングで強制アンラッピングがクラッシュするようにしてください(またはアサート、ガード、または前提条件を使用してください)。 )

大幅にあなたのコードを変更せずに、ここに私のために正常に動作するものである:

override func viewDidLoad() { 
    super.viewDidLoad() 

    navigationItem.title = "Howdie!" 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "02-redo")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onEditClick), forControlEvents: .TouchUpInside) 
     editBarButton = UIBarButtonItem(customView: button) 
    } 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "03-loopback")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onLogoutClick), forControlEvents: .TouchUpInside) 
     logoutBarButton = UIBarButtonItem(customView: button) 
    } 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "04-squiggle")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onShowRepositoryOnWebClick), forControlEvents: .TouchUpInside) 
     showRepositoryBarButton = UIBarButtonItem(customView: button) 
    } 

    navigationItem.setRightBarButtonItems([editBarButton, logoutBarButton, showRepositoryBarButton], animated: false) 
} 
関連する問題