Ios 在某些情况下,uibarbuttonim行动方法不起作用 当前的问题和我想知道的事情
在某些情况下,uibarbuttonim作用方法不起作用。我想知道为什么它不起作用 案例1 刚刚将NavigationController添加到默认的ViewControllerIos 在某些情况下,uibarbuttonim行动方法不起作用 当前的问题和我想知道的事情,ios,swift,Ios,Swift,在某些情况下,uibarbuttonim作用方法不起作用。我想知道为什么它不起作用 案例1 刚刚将NavigationController添加到默认的ViewController import UIKit class ViewController: UIViewController { let okButton = UIBarButtonItem(title: "OK", style: .plain, target: self, action: #selector(okButton
import UIKit
class ViewController: UIViewController {
let okButton = UIBarButtonItem(title: "OK", style: .plain, target: self, action: #selector(okButtonTapped(_:)))
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = okButton
}
@objc func okButtonTapped(_ sender: UIBarButtonItem) {
print("OK!")
}
}
在这种情况下,“确定”按钮不起作用。
没有错误消息
案例2
将导航栏添加到默认的ViewController。
UINavigationItem连接到名为myNavigationItem的插座
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myNavigationItem: UINavigationItem!
let okButton = UIBarButtonItem(title: "OK", style: .plain, target: self, action: #selector(okButtonTapped(_:)))
override func viewDidLoad() {
super.viewDidLoad()
myNavigationItem.rightBarButtonItem = okButton
}
@objc func okButtonTapped(_ sender: UIBarButtonItem) {
print("OK!")
}
}
在这种情况下,OK按钮起作用
总结
我知道即使在案例1中,如果在viewDidLoad中执行okButton初始化,它也会工作。
我想知道为什么案例2有效,但案例1无效
谢谢。如果在
viewDidLoad
之前初始化ok按钮
,则无法设置目标self
。因此,在viewDidLoad
class ViewController: UIViewController {
var okButton:UIBarButtonItem?
override func viewDidLoad() {
super.viewDidLoad()
okButton = UIBarButtonItem(title: "OK", style: .plain, target: self, action: #selector(okButtonTapped(_:)))
self.navigationItem.rightBarButtonItem = okButton
}
@objc func okButtonTapped(_ sender: UIBarButtonItem) {
print("OK!")
}
}
如果您需要整个类都可以访问该按钮,只需按原样声明它,但在viewDidLoad中初始化它。
案例2之所以有效,是因为在调用view Dod load时,故事板会为您提供myNavigationItem。在viewDidLoad中检查案例1中self.navigationItem的值。我总结了它,因为我自己解决了它
self
无法使用,因为实例本身尚未创建。但是,它被视为nil
,不会导致错误。这两种情况都是如此nil
,则当在视图层次结构上发现操作方法(ngbuttonattaped
)时,将执行该目标ViewController
,因此找不到任何操作方法,也不会发生任何事情。(可以使用Xcode视图调试器确认视图层次结构)ngbuttonattaped
),因为ViewController
位于导航栏上方或者说,谢谢你的回答。我还是一点也不懂。为什么仅在案例1中,我不能在
viewDidLoad
之前设置目标self
。self
是ViewController
的一个实例,对吗?@capibara,因为self在viewdidload之前还没有初始化