UIView 内的 UIButton 目标操作

Posted

技术标签:

【中文标题】UIView 内的 UIButton 目标操作【英文标题】:UIButton Target Action inside UIView 【发布时间】:2015-09-03 23:20:45 【问题描述】:

我创建了一个自定义UIView,其中我有一个UIButton。在该视图中,我有以下代码:

func setupViews() 
    menuControlButton.addTarget(self, action: "toggleButton:", forControlEvents: .TouchUpInside)


func toggleButton(sender: MenuControlButton!) 
    let isActive = sender.toggleActive() // switches button image and returns whether active or not after
    NSUserDefaults.standardUserDefaults().setBool(isActive, forKey: sender.title)
    someOtherViewController.reloadCalendar()

这是一个不好的做法吗?特别是因为我通过自定义UIView 调用另一个控制器的函数。

我应该改为让这些方法在 ViewController 中吗?或者有更好的方法吗?

【问题讨论】:

【参考方案1】:

我认为在视图内部了解父结构并不是一个好主意。它破坏了封装并导致难以维护、错误和额外的关系。

作为一种简单的方法,您可以为自定义 UIView 定义函数 addTarget,这将像一座桥梁一样工作。

class UICustomView 
   func addTarget(target: AnyObject, action: Selector, forControlEvents: UIControlEvents) 
        menuControlButton.addTarget(target, action: action, forControlEvents: forControlEvents)
    

    func setupViews() ...

    func toggleButton(sender: MenuControlButton!) ...

class SomeOtherViewController 

    func someInitFunc 
        let viewWithButton = UICustomView()
        viewWithButton.addTarget(self, "foo:", .TouchUpInside)
    

    func foo(sender: AnyObject) 
        let isActive = sender.toggleActive() // switches button image and     returns whether active or not after
        NSUserDefaults.standardUserDefaults().setBool(isActive, forKey: sender.title)
        self.reloadCalendar()
    

那么你的控制器只知道 UICustomView 可以处理事件,而 UICustomView 对 SomeOtherViewController 一无所知

如果您的自定义视图中有多个按钮,那么实现 UIAlertController 之类的 UIAlertControllerStyle.ActionSheet 类型可能是个好主意

【讨论】:

【参考方案2】:

Thomas:如果我理解错误,请纠正我。我假设您有一个 ViewController (SomeOtherViewController) 和 UIView (CustomView) 的自定义类。在自定义视图中,您有一个按钮。您正在将 someotherviewcontroller 指针传递给 customview 类并重新加载控制器视图(日历)。

如果上述情况是正确的,那么我觉得你在 CustomView 类中创建一个协议并在 SomeOtherViewController 中实现该协议方法并在其中重新加载数据会更好。

【讨论】:

以上是关于UIView 内的 UIButton 目标操作的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 将目标添加到子视图内的 UIButton

UIScrollview内的UIView内的UIButton,ARC问题

滚动视图内的UIButton不可单击

UIScrollView 内的 UIView 上的 UIButton

程序化 UIView 内的程序化 UIButton 不起作用

UIview下的UIButton无法触摸