2016-04-03 43 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運行。相反,它是UIViewController誰必須在UINavigationController中顯示按鈕。

因此,只需移動UIViewController中的代碼即可。

+0

好吧,showRepositoryButton沒有顯示 - 這是我指出的一個錯誤。真的很驚訝,甚至沒有得到我的詳細長答覆感謝... –

+1

@DavidH對不起,如果我似乎是粗魯的。你的解決方案實際上不起作用,儘管你正確地指出了一個不同的錯誤。無論如何,謝謝你。 –

0

請注意,您的代碼存在多個問題。首先,請注意,儘管UIButton()將返回一個非可選項,但UIImage可能會返回一個可選項。所以你現在真的不知道你是否確實輸入了正確的圖像名稱。我使用上面的代碼創建了一個簡單的項目,其中沒有圖像,並且如果圖像爲零,則沒有任何圖像顯示。

然後添加圖像,我只有兩個圖像顯示。仔細查看你的代碼,第三張圖片重新定義了loginButton,但是沒有在showRepositoryButton上設置任何屬性。

幾點建議:

  • 我們「做{...}」創建子上下文來避免意外變再利用
  • 如果使用的UIButton,使用指定的初始化(的UIButton(類型:...)
  • 更好的是,使用UIBarButtonItem(image:...)
  • 支付真正密切關注可選項,並且讓它在適當的時候強制解包崩潰(或使用斷言,守衛或前提條件)

沒有大幅修改代碼,這裏對我來說是什麼工作得很好:

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) 
}