Ios 在某些情况下,uibarbuttonim行动方法不起作用 当前的问题和我想知道的事情

Ios 在某些情况下,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

在某些情况下,uibarbuttonim作用方法不起作用。我想知道为什么它不起作用

案例1

刚刚将NavigationController添加到默认的ViewController

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
    )时,将执行该目标
  • 在案例1中,导航栏上方没有
    ViewController
    ,因此找不到任何操作方法,也不会发生任何事情。(可以使用Xcode视图调试器确认视图层次结构)
  • 在案例2中,执行操作方法(
    ngbuttonattaped
    ),因为
    ViewController
    位于导航栏上方

  • 或者说,谢谢你的回答。我还是一点也不懂。为什么仅在案例1中,我不能在
    viewDidLoad
    之前设置目标
    self
    self
    ViewController
    的一个实例,对吗?@capibara,因为self在viewdidload之前还没有初始化