首页 > 解决方案 > 动态更改导航栏项目 - Swift

问题描述

我正在创建一个位于屏幕右侧的NavigationBarUIBarButtonItem默认情况下,我使用它进行设置,setRightBarButtonUIBarButtonItem(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)
}

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

标签: iosswiftuinavigationbaruibarbuttonitem

解决方案


当您创建一个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
    }
}

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

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

推荐阅读