UIView 中的 UIButton 目标操作

Tho*_*mas 4 uibutton uiviewcontroller uiview ios swift

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()
}
Run Code Online (Sandbox Code Playgroud)

不过,这是一个不好的做法吗?特别是因为我通过自定义UIView.

我应该改为让这些方法在 ViewController 中吗?或者有没有更好的方法来做到这一点?

Max*_*Max 5

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

作为一种简单的方法,您可以为您的自定义 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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