如何将自定义 UIControl 中按下的 UIButton 传递给我的视图控制器?

Posted

技术标签:

【中文标题】如何将自定义 UIControl 中按下的 UIButton 传递给我的视图控制器?【英文标题】:How do I pass the UIButton pressed from my custom UIControl to my view controller? 【发布时间】:2020-05-18 10:10:34 【问题描述】:

我有一个自定义 UIControl 和 3 个 UIButtons:

这个UIControl 嵌入在视图控制器内的UIView(黄色矩形)中:

每个按钮都有不同的标签(tag1、tag2、tag3)。我需要确定在视图控制器中按下了哪个按钮。

我正在尝试在我的UIControl 中使用sendActionsForControlEvents 将其发送到视图控制器。

[self.button1 sendActionsForControlEvents:UIControlEventTouchUpInside];
[self.button2 sendActionsForControlEvents:UIControlEventTouchUpInside];
[self.button3 sendActionsForControlEvents:UIControlEventTouchUpInside];

我不知道如何在我的视图控制器中接收它以及如何识别按下了哪个按钮。

谁能帮帮我?

谢谢。

【问题讨论】:

【参考方案1】:

我解决了在 UIControl 中创建 @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *tabsCollection; 的问题。

然后在我的 ViewController 中创建一个循环来迭代这个 IBOutletCollection 并在每个按钮上添加一个动作来控制触摸事件。

    for (button in self.customTabsComponent.tabsCollection) 
        [button addTarget:self 
                   action:@selector(tabPressed:) 
         forControlEvents:UIControlEventTouchUpInside];

【讨论】:

【参考方案2】:

首先,明确职责。 如果您开发了一个管理按钮集合的自定义控件,它应该负责接收这些按钮中的操作并通过自己的接口将它们转发给视图控制器。

您的视图控制器根本不应该负责管理这些按钮。

否则,如果管理按钮和代码的责任在您的视图控制器内部,那么您的自定义控件就不是独立的,也不是可重用的控件。如果不将该代码复制粘贴到使按钮工作的视图控制器中,您将无法将其与另一个视图控制器一起使用。

现在,如果您的自定义控件是 UIControl 的子类,则您不能使用sendActionsForControlEvents 来传递点击了哪个按钮的信息,因为该界面设计为具有一个操作,但针对不同的事件类型。您需要的是不同的操作,或者某种指示点击了哪些按钮的附加信息。

UIAlertController 为例。其中一种方法是实现一个动态的动作数组,这些动作将在您的视图控制器中创建,传递给您的自定义控件并由按钮调用。您的按钮需要在您的自定义控件中动态分配。多做一些工作,但这是最合适的方法。

如果您想要一组静态按钮,您可以将块类型的属性添加到您的自定义控件。不同的按钮会调用不同的块。

或者,您可以创建一个新的委托协议并传递按下按钮的索引,请参阅 UIAlertViewDelegate。这是一种有点老派的方法,在块可用之前使用。

【讨论】:

以上是关于如何将自定义 UIControl 中按下的 UIButton 传递给我的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除我在 Flex 中按下的按钮?

如何检查在VB中按下的键

如何传递和收集 UITableView 中按下的信息

如何禁用在android片段类中按下的后退按钮

在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow

在 Swift 中按任意键更改自定义 UIButton 的 BG 颜色