【问题标题】:Swift | UIBarButton not working / not going to action target斯威夫特 | UIBarButton 不工作/不去行动目标
【发布时间】:2019-06-25 18:25:42
【问题描述】:

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

【问题讨论】:

  • 你继承自 UINavigationController 并覆盖 viewDidLoad?
  • 我在 AppDelegate 中添加了这样的导航控制器:var navigationController: UINavigationController?是的 viewDidLoad 被覆盖,其他一切正常
  • 你能用你的自定义viewDidLoad显示一个类声明吗?喜欢class Name: Something
  • 是不是因为speaker图片不存在而看不到这个按钮?
  • 我看到的下一个问题是 objc 方法中有两个 if 语句。您首先更改文本,然后执行第二个,因此您始终运行两个 if 语句。您应该使用else if 代替第二个条件

标签: ios swift uinavigationcontroller uibarbuttonitem


【解决方案1】:

当您像您一样初始化 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
}

【讨论】:

  • 非常感谢,懒惰的 var 起作用了,你能告诉我为什么让我以后知道吗?
  • 在您的初始代码中,volumeButton 在视图控制器本身(您声明为按钮的目标)仍为 nil 的位置初始化。因此,按钮在按下时将其操作发送到nil,而不是视图控制器实例。有了lazy varvolumeButton 在您的代码中首次访问时(如果有的话)会被初始化。这肯定会发生在视图控制器初始化之后。希望对您有所帮助。
猜你喜欢
  • 2016-02-16
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2016-12-31
相关资源
最近更新 更多