如何在父视图中从子视图处理键盘事件

时间:2015-08-02 23:39:59

标签: ios swift

我是iOS开发的新手,我遇到了一个看似简单的问题,但无论我尝试哪种方式都无法解决。

我有一个包含2个UI元素的自定义视图类@IBDesignable class ValidatedInputFieldView: UIView。 其中之一是UITextField

ValidatedInputFieldView已添加到其父视图class ViewController: UIViewController, UITextFieldDelegate

我希望ViewController回复来自textFieldShouldReturn的{​​{1}}事件,而不是回复UITextField所在的ValidatedInputFieldView

我已尝试公开UITextField的{​​{1}}字段:

delegate

并在UITextView

中进行设置
@IBOutlet var textFieldDelegate:UITextFieldDelegate?

然后使用解决方法在IB中链接它: 将插座的类型声明为AnyObject或NSObject,使用Interface Builder将对象连接到插座,然后将插座的类型更改回协议

但它根本不起作用。

Debug说对象是ValidatedInputFieldView

我无法理解Subview中发生的事件是如何传递给Parent视图的,以及我应该使用什么来公开代理。

1 个答案:

答案 0 :(得分:0)

我喜欢的典型风格是保留其视图中包含的项目。我要做的是将textFieldShouldReturn函数放在ValidateInputView中,并将UITextField的委托设置为ValidateInputView。然后,在textFieldShouldReturn函数中,使用

发布通知
NSNotificationCenter.defaultCenter().postNotificationName("textFieldFunction", object: self)

并确保您正在使用ViewController收听:

NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: Selector("textFieldFunction:"),
    name: "textFieldFunction",
    object: nil)

并在textFieldFunction中创建函数ViewController来处理它:

func textFieldFunction(notification: NSNotification) {
    //Put code to handle return press here
}

请务必将其放在ViewController中:

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

或没有通知

使用此示例项目中的解决方案: https://mega.nz/#!koYDTZpa!uGZ6oUbKxRaWuGSM9FbCuV0t8oz5mtu35rZlLEL7Ehs

对不起,我会发布代码,但由于它主要是通过IB进行的,所以并不多。