2016-04-03 85 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) 
}