从外部 xib/nib 文件导入的自定义按钮不响应按钮单击

Posted

技术标签:

【中文标题】从外部 xib/nib 文件导入的自定义按钮不响应按钮单击【英文标题】:Custom buttons imported from an external xib/nib file not responding to button click 【发布时间】:2018-12-24 18:10:03 【问题描述】:

我正在开发一个包含一大堆按钮的应用程序,这些按钮的格式完全相同——大小、布局、颜色、文本标签等。类似于它与“原型”单元格的工作方式表视图和容器视图,我正在尝试在外部 xib 中创建“原型”按钮的一个实例作为 UIButton 的自定义类,我可以将其拉入主视图控制器并根据需要重复。

我在输入按钮时没有遇到任何问题,在自定义文本标签等方面也没有遇到任何问题。所以这并不像是“原型”没有正确输出的问题。

实际的按钮点击似乎不起作用。

我有两个按钮——button1 和 button2,它们被分配了 tag=1 和 tag=2。为了测试按钮操作,我设置了一个打印语句,将发送者的标签号打印到控制台。

如果我在主情节提要中创建一个简单、普通的按钮,并给它一个标签号,则该按钮的行为正确。但是自定义类按钮不会向控制台发送任何内容。

我错过了一步吗?我的直觉是,我缺少的外部 xib 中有一个额外的细节......但我认为细节(标签号等)需要与每个实例相关联,而不是与原型相关联。

    import UIKit

class ViewController: UIViewController 

@IBOutlet weak var button1: customButton!
@IBOutlet weak var button2: customButton!

override func viewDidLoad() 
    super.viewDidLoad()
    button1.customTitle.text = "This is Button 1"
    button2.customTitle.text = "This is Button 2"


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


@IBAction func buttonPressed(_ sender: UIButton) 

    print(sender.tag)

    

编辑:这里是生成按钮的 xib 中的代码。

import UIKit

class customButton: UIButton 

    @IBOutlet var contentView: UIView!
    @IBAction func buttonPressed(_ sender: UIButton) 


    override init(frame: CGRect)  // for using CustomView in code
        super.init(frame: frame)
        commonInit()
    

    required init?(coder aDecoder: NSCoder)  // for using CustomView in IB
        super.init(coder: aDecoder)
        commonInit()
    

    private func commonInit() 
        Bundle.main.loadNibNamed("customButton", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    

【问题讨论】:

如何将按钮操作链接到notePressed 在与自定义 .xib 关联的 .swift 文件中,我有一个从按钮到此代码的出口:@IBAction func notePressed(_ sender: UIButton) ... 您能否将建立连接的代码添加到您的问题中? 完成。希望能对事情有所启发。 所以,customButton 类中有一个空的 buttonPressed 函数。如果这是您的按钮操作,那么没有调用视图控制器功能是有道理的。 (尝试从customButton 操作打印一些内容,看看会发生什么。) 【参考方案1】:

我现在在您编辑的答案中看到,您添加了一个 contentView 作为子视图。将它的交互启用状态设置为 false,这样它就不会关心触摸本身,并且应该触发按钮操作。

在您的按钮文件中,可能在 commonInit 中:

contentView.isUserInteractionEnabled = false

【讨论】:

谢谢。只是为了确保我清楚——这在主视图控制器文件中,对吗?不是与自定义 xib 类关联的 .swift 文件,对吗? @MMac 是的,它应该放在主 ViewController 中,让我知道它是否有效 恐怕运气不好。我怀疑问题出在 xib 方面? @MMac 我已经更新了我的答案,你现在能看到我答案的底部吗。 是的,它现在可以工作了,但有趣的是,我应用 addTarget() 的 2 个按钮(按钮 1 和 2)现在是“双重打击”,例如按钮 1 向控制台打印两次“1”,按钮 2 两次打印“2”。我设置了其他几个按钮,don't 调用 addTarget() 行为正常 - 所以,例如按钮 3,它没有 addTarget 语句,但受 isUserInteractionEnabled 语句的约束 - 工作正常 - 一键 = 一个“3”到控制台。所以我想答案很简单,就是 contentView.isUserInteractionEnabled = false 是需要什么?

以上是关于从外部 xib/nib 文件导入的自定义按钮不响应按钮单击的主要内容,如果未能解决你的问题,请参考以下文章

如何在框架内加载 `.xib` / `.nib` 文件?

如何使用 webpack 从项目根目录导入外部文件?

iPhone SDK,在运行时替换 XIB/NIB 文件 onViewDidAppear 或任何时间?

MainWindow.xib nib 文件有啥用?

自定义 UITableViewCell 打开不同的 xib 子视图

为啥由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器