ios - UIView 中的 UIButton 目标操作

标签 ios swift uiview uiviewcontroller uibutton

我创建了一个自定义 UIView,其中有一个 UIButton。在那个 View 中,我有这段代码:

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 调用另一个 Controller 的函数。

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

最佳答案

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

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

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

如果您的自定义 View 中有多个按钮,也许最好实现类型为 UIAlertControllerStyle.ActionSheet 的 UIAlertController 之类的东西

关于ios - UIView 中的 UIButton 目标操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386891/

相关文章:

php - 字典中的 JSON 编码字典未使用 AFNetworking 正确反序列化

ios - iPad Air iOS 7.1 和 iOS 8.0 中的 FFCalender + Xcode 6.0.1 + UICollectionView,月 View 分散

ios - 更新 Realm 对象的上传进度

ios - 为数组编码上一个按钮

ios - 使用 UIPanGestureRecognizer 连续移动 SKSpriteNode

ios - 如何查看用户是新用户还是老用户

iphone - Howe 捕获 UIView 顶部 UIView

swift - 通用协议(protocol)方法 swift 无法将类型识别为类型

uiview - 将多个UITapGestureRecognizers添加到单个 View (Cocos2d)

swift - UIView 的子类不调用 didSet