ios - 动态更改导航栏项目 - Swift
问题描述
我正在创建一个位于屏幕右侧的NavigationBar
。UIBarButtonItem
默认情况下,我使用它进行设置,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)
}
我也尝试使用主线程,但它没有按我预期的那样工作。
解决方案
当您创建一个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)
}
}
推荐阅读
- php - 更好地理解magento接口
- android - Android View 在后台时可见性发生变化(任务切换器)
- facebook - 如何为firebase用户取消链接facebook登录?
- java - 无法运行程序 CreateProcess 错误=206,文件名或扩展名太长
- powershell - 如何仅为特定的少数用户获取 $userPath
- postgresql - 如何自定义一个官方的 docker postgres 镜像并构建它?
- android - 为什么 Facebook 身份验证 SDK 在不同模式下的行为如此不同?
- java - 使用 getActivity.runOnUiThread() 在每个时间间隔后更新 Fragment ui
- android - JavaPoet如何给Activity添加参数?
- php - 当我通过 config() 获取数组的键时,为什么它们会改变?