我创建了一个自定义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中?或者有更好的方法吗?
答案 0 :(得分:4)
我认为在关于父结构的视图中知道它并不是一个好主意。它打破了封装,导致难以维护,错误和额外的关系。
作为一种简单的方法,您可以为自定义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一无所知
如果您在自定义视图中有多个按钮,那么使用类型为UIAlertControllerStyle.ActionSheet的UIAlertController实现一些可能是个好主意
答案 1 :(得分:0)
如果上面的场景是正确的,那么我觉得你在CustomView类中创建一个协议并在SomeOtherViewController中实现该协议方法并在其中重新加载数据感觉更好。