如果在添加 barBarttonItem 的范围之外创建,为什么添加 barBarttonItem 不起作用?
Why adding barBarttonItem won’t work if created out of scope where it’s added?
我 运行 在添加 barButtons 时遇到了一些问题,并在另一个 的答案中找到了解决方案,但它没有解释为什么你必须在同一个中创建和添加按钮范围。我想知道为什么你不能在 class 级别创建按钮并将它们添加到像 viewDidLoad 这样的方法中。从下面复制的那个问题中不起作用的示例代码:
let rightButton = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(onRightClick))
let leftButton = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(onLeftClick))
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = rightButton
navigationItem.leftBarButtonItem = leftButton
}
出现无法识别@objc 方法(此处未包含)的错误。这些方法没有任何问题,因为当您在 viewDidLoad 中移动按钮创建时,错误消失并且代码有效。
这些栏按钮属性是在调用 init 之前创建的,并且您正在尝试访问 class 在调用 init 之前无法调用的方法。
如果您想在 class 范围内初始化您的按钮,您必须将它们设为 lazy
变量,以便在需要时创建它们
lazy var rightButton = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(onRightClick))
lazy var leftButton = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(onLeftClick))
override func viewDidLoad() {
super.viewDidLoad()
let leftBarButton = UIBarButtonItem(title: "Left Button", style: .plain, target: self, action: #selector(pressOnleftBarButton))
navigationItem.leftBarButtonItem = leftBarButton
let rightBarbutton = UIBarButtonItem(title: "Right Button", style: .plain, target: self, action: #selector(pressOnRightBarButton))
navigationItem.rightBarButtonItems = rightBarbutton
}
@objc func pressOnleftBarButton(){
//Perform Action on Left Button
}
@objc func pressOnRightBarButton(){
//Perform Action on right Button
}
我 运行 在添加 barButtons 时遇到了一些问题,并在另一个
let rightButton = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(onRightClick))
let leftButton = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(onLeftClick))
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = rightButton
navigationItem.leftBarButtonItem = leftButton
}
出现无法识别@objc 方法(此处未包含)的错误。这些方法没有任何问题,因为当您在 viewDidLoad 中移动按钮创建时,错误消失并且代码有效。
这些栏按钮属性是在调用 init 之前创建的,并且您正在尝试访问 class 在调用 init 之前无法调用的方法。
如果您想在 class 范围内初始化您的按钮,您必须将它们设为 lazy
变量,以便在需要时创建它们
lazy var rightButton = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(onRightClick))
lazy var leftButton = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(onLeftClick))
override func viewDidLoad() {
super.viewDidLoad()
let leftBarButton = UIBarButtonItem(title: "Left Button", style: .plain, target: self, action: #selector(pressOnleftBarButton))
navigationItem.leftBarButtonItem = leftBarButton
let rightBarbutton = UIBarButtonItem(title: "Right Button", style: .plain, target: self, action: #selector(pressOnRightBarButton))
navigationItem.rightBarButtonItems = rightBarbutton
}
@objc func pressOnleftBarButton(){
//Perform Action on Left Button
}
@objc func pressOnRightBarButton(){
//Perform Action on right Button
}