UIView 中的 UIButton 目标操作
UIButton Target Action inside UIView
我创建了一个自定义 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 中?或者有更好的方法吗?
Thomas:理解有误请指正。我假设您有一个 ViewController (SomeOtherViewController) 和自定义 class 用于 UIView (CustomView)。在自定义视图中,您有一个按钮。您正在将 someotherviewcontroller 指针传递给 customview class 并重新加载控制器视图(日历)。
如果上述情况是正确的,那么我觉得你在 CustomView class 中创建一个协议并在 SomeOtherViewController 中实现该协议方法并在其中重新加载数据会更好。
我认为在视图内部了解父结构并不是一个好主意。它破坏了封装并导致难以维护、错误和额外的关系。
作为一种简单的方法,您可以为您的自定义 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一无所知
如果您的自定义视图中有多个按钮,也许最好实现类型为 UIAlertControllerStyle.ActionSheet
的 UIAlertController 之类的东西
我创建了一个自定义 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 中?或者有更好的方法吗?
Thomas:理解有误请指正。我假设您有一个 ViewController (SomeOtherViewController) 和自定义 class 用于 UIView (CustomView)。在自定义视图中,您有一个按钮。您正在将 someotherviewcontroller 指针传递给 customview class 并重新加载控制器视图(日历)。
如果上述情况是正确的,那么我觉得你在 CustomView class 中创建一个协议并在 SomeOtherViewController 中实现该协议方法并在其中重新加载数据会更好。
我认为在视图内部了解父结构并不是一个好主意。它破坏了封装并导致难以维护、错误和额外的关系。
作为一种简单的方法,您可以为您的自定义 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一无所知
如果您的自定义视图中有多个按钮,也许最好实现类型为 UIAlertControllerStyle.ActionSheet
的 UIAlertController 之类的东西