【问题标题】:Change Navigation Bar Item Dynamically - Swift动态更改导航栏项目 - Swift
【发布时间】:2019-05-31 07:28:54
【问题描述】:

我正在使用位于屏幕右侧的UIBarButtonItem 创建一个NavigationBar。默认情况下,我将setRightBarButton 设置为UIBarButtonItem(image: UIImage(named: "edit"), style: .plain, target: self, action: #selector(editProfile)),当我点击它时,它应该将rightBarButton 更改为其他标题,但它不起作用。

这是我尝试更改并单击它

@objc
func editProfile() {
    self.navigationItem.setRightBarButton(cancelActionBar, animated: true)

}

这是cancelActionBar的对象

let cancelActionBar = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelEdit))

这是将其更改回默认值的操作。

@objc
func cancelEdit() {
    self.navigationItem.setRightBarButton(editActionBar, animated: true)
}

我也尝试使用主线程,但它没有按预期工作。

【问题讨论】:

  • 根本不工作?您是否尝试设置断点? editProfile 被调用了吗?
  • @Lu_ 当然它不起作用,因为我在 viewdidload() 之外声明了它。现在它正在工作

标签: ios swift uinavigationbar uibarbuttonitem


【解决方案1】:

当您创建UIBarButtonItem 作为实例属性时,目标self 还不会被初始化。所以设置目标self 是行不通的。

class ViewController: UIViewController {
    let editActionBar = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(editBtnAction(_:)))
    override func viewDidLoad() {
        super.viewDidLoad()
        print(editActionBar.target)//nil
    }
}

在viewDidLoad中初始化按钮时,目标self将被正确分配

class ViewController: UIViewController {
    var editActionBar: UIBarButtonItem?
    override func viewDidLoad() {
        super.viewDidLoad()
        editActionBar = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(editBtnAction(_:)))
        print(editActionBar?.target)//self
    }
}

将按钮声明为可选并在 viewDidLoad 中初始化按钮。

class ViewController: UIViewController {

    var editActionBar: UIBarButtonItem?
    var cancelActionBar: UIBarButtonItem?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.editActionBar = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(editBtnAction(_:)))
        self.cancelActionBar = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelBtnAction(_:)))
        self.navigationItem.setRightBarButton(editActionBar, animated: true)
    }
    @objc func editBtnAction(_ sender: UIBarButtonItem) {
        self.navigationItem.setRightBarButton(cancelActionBar, animated: true)
    }
    @objc func cancelBtnAction(_ sender: UIBarButtonItem) {
        self.navigationItem.setRightBarButton(editActionBar, animated: true)
    }
}

【讨论】:

  • 你是对的。我没有在viewDidLoad() 中初始化我只是在viewdidload() 之外声明它。现在它正在工作..
【解决方案2】:

在 viewDidLoad 方法中设置编辑为条形按钮

override func viewDidLoad() {
      self.setBarButton(isSetEditBarButton: true)
}

@objc func editProfile() {
    self.setBarButton(isSetEditBarButton: false)
}


@objc func cancelEdit() {
    self.setBarButton(isSetEditBarButton: true)
}


 private func setBarButton(isSetEditBarButton: Bool) {
     if isSetEditBarButton {
           let editActionBar = UIBarButtonItem(image: UIImage(named: "edit"), style: .plain, target: self, action: #selector(editProfile))
           self.navigationItem.setRightBarButton(editActionBar, animated: true)
     } else {
           let cancelActionBar = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelEdit))
           self.navigationItem.setRightBarButton(cancelActionBar, animated: true)
     }
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多