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
}
所以我在 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
}