斯威夫特| UIBarButton无法正常工作/无法执行操作目标

时间:2019-02-01 07:45:57

标签: ios swift uinavigationcontroller uibarbuttonitem

所以我在类外创建了一个自定义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")
    }
}

1 个答案:

答案 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
}