所以我在类外创建了一个自定义UIBarButtonItem并设置了它的属性。 我将它添加到导航控制器中的单独方法中,该方法从viewDidLoad()中调用。按钮的目标在类本身内声明。 我什至尝试在目标方法上添加断点以确保其有效,但事实证明,即使断点,按钮也不会到达目标并轻按。 我已经以编程方式编写了所有代码。
我尝试过关于stackoverflow的问题的答案,但是没有用。
当我在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")
}
}
答案 0 :(得分:2)
像您一样初始化self
时,目标(nil
)仍然是volumeButton
。将按钮改为lazy var
:
lazy var volumeButton = UIBarButtonItem(image: UIImage(named: "speaker"), style: .plain , target: self, action: #selector(volumeButtonTapped))
正如@Robert Dresler所说,您还必须用if
替换volumeButtonTapped
函数中的第二个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
}