Swift | UIBarButton 不工作/不去行动目标

Swift | UIBarButton not working / not going to action target

所以我在 class 之外创建了一个自定义 UIBarButtonItem 并设置了它的属性。 我用一个单独的方法将它添加到导航控制器中,该方法从 viewDidLoad() 调用。按钮的目标在 class 本身内声明。 我什至尝试在目标方法中添加一个断点以确保它有效,但事实证明按钮没有到达目标并且尽管有断点但仍然点击。 我已经以编程方式编写了所有代码。

我在 Whosebug 上尝试了这个问题的答案,但没有成功。

当我在 viewDidLoad 中声明按钮时,目标确实识别了按钮并且按钮也没有显示。

提前致谢,下面是相同的代码

// inside class but outside viewDidLoad
    let volumeButton = UIBarButtonItem(image: UIImage(named: "speaker"), style: UIBarButtonItem.Style.plain , target: self, action: #selector(volumeButtonTapped(_ :)))

//// inside a custom method which is called from viewDidLoad()
self.navigationItem.leftBarButtonItem = volumeButton

//// below is the target declared inside the class
@objc func volumeButtonTapped(_ sender: Any) {
    if volume=="loud"{
        volume = "mute"
        volumeButton.image = UIImage(named: "mute")
        print("volume set to mute")
        //UserDefaults.standard.set(volume, forKey: "mute")
    }
     if volume == "mute"{
        volume = "loud"
        volumeButton.image = UIImage(named: "speaker")
        print("volume set to loud")
        //UserDefaults.standard.set(volume, forKey: "speaker")
    }
}

当您像您一样初始化 volumeButton 时,目标 (self) 仍然是 nil。将按钮设为 lazy var

lazy var volumeButton = UIBarButtonItem(image: UIImage(named: "speaker"), style: .plain , target: self, action: #selector(volumeButtonTapped))

正如@Robert Dresler 所说,您还必须将 volumeButtonTapped 函数中的第二个 if 语句替换为 else if 以使您的代码正常工作 - 尽管这无关紧要与目标行动问题。

您还可以使用与此类似的解决方案使您的代码更简洁:

var deviceIsMuted = false {
    didSet {
        volumeButton.image = UIImage(named: deviceIsMuted ? "mute" : "speaker")
        print("volume set to", deviceIsMuted ? "mute" : "loud")
    }
}

@objc func volumeButtonTapped(_ sender: Any) {
    deviceIsMuted = !deviceIsMuted
}