BarButtonItem 没有出现

Posted

技术标签:

【中文标题】BarButtonItem 没有出现【英文标题】:BarButtonItem not showing up 【发布时间】:2016-03-16 19:45:11 【问题描述】:

在我制作的应用程序中,我尝试启用登录/注销到 Twitter。我想要它,以便有一个 barbuttonitem 表示如果没有当前用户则登录,或者如果有一个则注销。我在故事板上创建了两个按钮,一个用于登录,一个用于注销。在 viewDidLoad() 中,我有这段代码:

self.navigationItem.rightBarButtonItem = nil
    self.navigationItem.rightBarButtonItem = nil


    if twitterUser.currentUser != nil 
        print("there is a current user")

        self.navigationItem.rightBarButtonItem = logoutButton

     else 
        self.navigationItem.rightBarButtonItem = loginButton
    

而且它似乎运作良好。当用户实际登录或退出时,问题就出现了。这些按钮连接到以下功能:

@IBAction func onLogin(sender: AnyObject) 

    let client = twitterAPI.sharedInstance

    client.login( () -> () in

        self.navigationItem.rightBarButtonItem =  nil

        self.navigationItem.rightBarButtonItem = self.logoutButton

        )  (error: NSError) -> () in
            print(error.localizedDescription)
    





    @IBAction func onLogout(sender: AnyObject) 
    twitterAPI.sharedInstance.logout()
    self.navigationItem.rightBarButtonItem = nil
    self.navigationItem.rightBarButtonItem = self.loginButton

登录后登录按钮会消失,但注销按钮不显示。注销时,注销按钮会消失,但不会出现登录按钮。我不确定是什么原因造成的,因为我在 viewDidLoad 中使用了相同的方法,而且它似乎工作正常。

【问题讨论】:

传递给 login() 的块是否在主线程上执行?如果你在 onLogin() 和 onLogout() 中打印一些东西,你看到消息了吗? 您可能会取消您的self.logoutButtonself.loginButton。在分配它们之前打印它们的描述。 【参考方案1】:

此代码可能对您有所帮助

    override func viewDidLoad() 
    
       super.viewDidLoad()
       barButton = UIBarButtonItem(title: "Login", style: UIBarButtonItemStyle.Done, target: self, action: "barBtnAction:")
       barButton.tag = 0
       self.navigationItem.rightBarButtonItem = barButton
    

    @IBAction func barBtnAction(sender:UIBarButtonItem)
               
       let shouldLogin: Bool = sender.tag == 0 ? true : false
       if shouldLogin
       
          //your code here
          onLogin()
       
       else
       
          //your code here
          onLogout()
       
    

  func onLogin()
  
      barButton.title = "Logout"
      barButton.tag = 1
  

  func onLogout()
  
      barButton.title = "Login"
      barButton.tag = 0
  

【讨论】:

let shouldLogin: Bool = sender.tag == 0 ? true : false 应该只是 let shouldLogin: Bool = sender.tag == 0 不知道你为什么添加了不必要的三元运算符 @Qunin:你可以用自己的方式修改代码。我只是给出了示例代码。如果您不喜欢三元条件语句,请使用 if else 条件块.. 我的意思是,在这种情况下,三元运算符绝对什么都不做,也没有必要使用 if else ......那会更糟 @Qunin:我使用三元运算符只是为了代码可读性。

以上是关于BarButtonItem 没有出现的主要内容,如果未能解决你的问题,请参考以下文章

如何在苹果电视的导航栏的 BarButtonItem 上移动焦点?

Tab Bar Controller + Navigation Controller + Bar Button Item

向导航栏添加另一个按钮

将 BarButtonItem 旋转 45 度(动画)

将 BarButtonItem 添加到 NavigationBar

一个 BarButtonItem 的多个操作