【问题标题】:Why is my UIButton target action not being called?为什么没有调用我的 UIButton 目标操作?
【发布时间】:2020-10-16 09:32:58
【问题描述】:

我正在使用 Google Maps API,并且我创建了一个 UIButton 来放置在地图视图的顶部。在那个 UIButton 里面,我插入了一个 UIImageView。出于某种原因,在我向 UIButton 添加目标操作后,没有调用选择器方法。以下是构建应用程序时元素外观的示例:

这是我的选择器方法:

@objc func goToListView() {
    print("Go to list view!")
}

这是我的 UIButton 代码:

func configureReturnToListViewItem() {
    view.addSubview(returnToListViewItem)
    returnToListViewItem.backgroundColor = .white
    returnToListViewItem.layer.cornerRadius = 25
    returnToListViewItem.clipsToBounds = true
    returnToListViewItem.isUserInteractionEnabled = true
    returnToListViewItem.translatesAutoresizingMaskIntoConstraints = false
    returnToListViewItem.heightAnchor.constraint(equalToConstant: 50).isActive = true
    returnToListViewItem.widthAnchor.constraint(equalToConstant: 50).isActive = true
    returnToListViewItem.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 25).isActive = true
    returnToListViewItem.topAnchor.constraint(equalTo: view.topAnchor, constant: 50).isActive = true
    returnToListViewItem.addTarget(self, action: #selector(goToListView), for: .touchUpInside)
}

这是 UIButton 内的图像代码,以防万一:

func configureReturnToListViewImage() {
    returnToListViewItem.addSubview(returnToListViewImage)
    let image = UIImage(named: "list")
    returnToListViewImage.image = image
    returnToListViewImage.contentMode = .scaleAspectFill
    returnToListViewImage.clipsToBounds = true
    returnToListViewImage.layer.masksToBounds = true
    returnToListViewImage.translatesAutoresizingMaskIntoConstraints = false
    returnToListViewImage.heightAnchor.constraint(equalToConstant: 20).isActive = true
    returnToListViewImage.widthAnchor.constraint(equalToConstant: 20).isActive = true
    returnToListViewImage.centerXAnchor.constraint(equalTo: returnToListViewItem.centerXAnchor).isActive = true
    returnToListViewImage.centerYAnchor.constraint(equalTo: returnToListViewItem.centerYAnchor).isActive = true
}

我尝试过点击手势,以及将视图控制器中的所有元素的 isUserInteractionEnabled 设置为 true。我希望得到一些指导!

编辑:我的问题是由于早期配置导致导航栏不可见。在大多数情况下,其他答案是正确的 - 因此,如果它们适用于您的情况,请也使用这些答案。

【问题讨论】:

    标签: ios swift uibutton autolayout uiimageview


    【解决方案1】:

    我在运行我的应用程序后使用 view debugger 找到了我的问题的答案。在我的具体情况下,我的不可见导航栏覆盖了按钮,这阻止了与导航栏下方任何内容的任何交互。我所要做的就是将这行代码添加到我的 viewDidLoad() 函数中:

    self.navigationController?.setNavigationBarHidden(true, animated: false)
    

    视图调试器是救命稻草!

    【讨论】:

    • 我怀疑你使用的是视图调试器,而不是内存图
    【解决方案2】:

    似乎returnToListViewImage 掩盖了returnToListViewItem。尝试不使用returnToListViewImage 以查看它是否触发了目标。如果是,您可以在returnToListViewImage 上添加轻击手势并将目标设置为goToListView,不要忘记将isUserIteractionEnabled 设置为truereturnToListViewImage,它的工作原理相同。

    更好的方法:您可以直接将图像设置为 UIButton 类型returnToListViewItem,就像这样,这将只需要一行而不是您给出的整个函数。

    returnToListViewItem.setImage(UIImage(named: "list"), for: .normal)
    

    【讨论】:

    • 我尝试删除 UIImageView,但它仍然无法仅使用 UIButton!不过,感谢您提供有关设置图像的提示。
    • 在这种情况下,您发布的代码 sn-p 似乎不会出现问题。您可能希望为其他人添加更多上下文以找出问题所在。尝试在其他地方添加相同的按钮,看看它是否正常工作,看看你在做什么不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多