在自定义视图中连接到 UIButton 的 AddTarget 不起作用。 (斯威夫特 5,iOS)

Posted

技术标签:

【中文标题】在自定义视图中连接到 UIButton 的 AddTarget 不起作用。 (斯威夫特 5,iOS)【英文标题】:AddTarget connected to UIButton in customView does not work. (swift5, iOS) 【发布时间】:2020-10-28 06:52:27 【问题描述】:

有一个带有 UIButton 的自定义 UIView。 viewController 尝试通过 addTarget(...) 将该函数连接到该 UIButton。但它不起作用。

class customView: UIView 
     var button: UIButton = 
        //some properties
     ()

class viewController: UIViewController 
     var cv = customView()
     override func viewDidLoad() 
         cv.button.addTarget(self, action: #selector(someFunction), for: .touchUpInside)
     
     @objc func someFunction() 
          print("Some function!")
     

这段代码不是我写的。但这是我正在编写的代码的非常简短的表示。触摸按钮时 SomeFunction 不起作用。还需要什么?

【问题讨论】:

【参考方案1】:

在简化的示例代码中很难找出实际问题,因为它本身并没有运行。 addTarget 本身的使用很好,所以我想问题出在代码的某个地方,我们在这里看不到。

有根据的猜测是自定义视图的大小/布局存在问题。根据视图的不同,视图的边界可能会小于按钮或为零,尽管您仍会看到完整的按钮,但您无法单击它。如果您在单击按钮时没有在按钮上获得任何颜色效果,您可能会在标准按钮上注意到这一点。

另一个好的下一步是查看 Xcode 的视图调试器,看看视图大小是否有问题。

作为参考,我对您的示例代码进行了一些编辑,以使其在 Playground 中运行,并且您的函数在那里被很好地触发。

import PlaygroundSupport
import UIKit

class CustomView: UIView 
    var button = UIButton(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 20.0))

    override init(frame: CGRect) 
        super.init(frame: frame)

        button.backgroundColor = .blue
        button.setTitle("click me", for: .normal)
        addSubview(button)
        button.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
        button.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    


class ViewController: UIViewController 
    var customView = CustomView()

    override func viewDidLoad() 
        customView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(customView)

        customView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        customView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        customView.button.addTarget(self, action: #selector(someFunction), for: .touchUpInside)
    

    @objc func someFunction() 
        print("Some function!")
    


PlaygroundPage.current.liveView = ViewController()

【讨论】:

感谢您的友好回复。我想我在尝试简要解释时过多地减少了源代码。但你的解释让我知道该尝试什么。我为我糟糕的英语水平感到抱歉。这是翻译者写的一句话。

以上是关于在自定义视图中连接到 UIButton 的 AddTarget 不起作用。 (斯威夫特 5,iOS)的主要内容,如果未能解决你的问题,请参考以下文章

在自定义表格视图单元格中设置 UIButton 的高度

UIbutton 在自定义 UITableViewCell 中释放

UIButton 在自定义 UITableviewCell 中没有响应

在自定义 UIView 上为 UIButton 设置动画

按钮未在自定义 UIButton 中注册触摸

在 Visual Studio .net 中连接到 Advantage Database .add