我有一个自定义的UIView(称为GridView),我初始化然后添加到ViewController(DetailViewController)。 GridView包含几个UIButton,我想在DetailViewController中触摸这些按钮时知道。我是Swift的新手,我想知道用于获取这些事件的最佳模式是什么?
答案 0 :(得分:1)
让我们假设你的GridView实现如下:
class GridView : UIView {
// Initializing buttons
let button1:UIButton = UIButton(...)
let button2:UIButton = UIButton(...)
// ...
// Adding buttons to view
self.addSubview(button1)
self.addSubview(button2)
// ...
}
现在,我们将添加选择器方法,当触摸按钮时将调用这些方法。让我们假设你的视图控制器的实现如下:
class DetailViewController : UIViewController {
let myView:GridView = GridView(...)
myView.button1.addTarget(self, action: "actionForButton1:", forControlEvents: UIControlEvents.TouchUpInside)
myView.button2.addTarget(self, action: "actionForButton2:", forControlEvents: UIControlEvents.TouchUpInside)
// ...
func actionForButton1(sender: UIButton!) {
// Your actions when button 1 is pressed
}
// ... Selectors for other buttons
}
我不得不说我的示例方法不是面向对象编程的封装原则的一个很好的例子,但我写的是这样的,因为你是Swift的新手,这个代码很容易了解。如果您想要防止重复的代码,例如为每个按钮编写不同的选择器,并且您想要将视图的属性设置为私有,以防止从"外部"就像我刚在DetailViewController中做的那样,有更好的解决方案。我希望它能帮到你!
答案 1 :(得分:1)
如果您想通过通知执行此操作,请使用1:
func postNotificationName(_ notificationName: String,
object notificationSender: AnyObject?)
在您的按钮触发的方法中。然后,在DetailViewController
中,在使用2初始化时添加一个侦听器:
func addObserver(_ notificationObserver: AnyObject,
selector notificationSelector: Selector,
name notificationName: String?,
object notificationSender: AnyObject?)
可以从NSNotificationCenter.defaultCenter()
调用这两个函数。
另一种方法是添加一个初始化GridView
DetailViewController
后连接的回调。回调基本上是一个闭包:
var callback : (() -> Void)?
您可以在需要时进行实例化,例如
// In DetailViewController initialization
gridView = GridView()
gridView.callback = { self.doSomething() }
在GridView
中你可以触发这样的回调:
func onButton()
{
callback?()
}
只有在展开成功时才会执行回调。请确保您已阅读Automatic Reference Counting,因为这些结构可能会导致强大的参考周期。
有什么区别?你只能连接回调一次(至少用我在这里展示的方法),但是当它触发时,接收器立即执行它的代码。对于通知,您可以拥有多个接收器,但事件传递会有一些延迟。
答案 2 :(得分:0)
我认为您最好创建一个名为GridView
的类,该类继承自UIView
。然后,您可以将所有UI元素与您的类连接为IBOutlet
或使用类似的标记。稍后,您可以在GridView
中询问DetailViewController
的实例,以便您可以IBAction
进行连接。
封装是OOP的原则之一。