如何为Swift应用程序中的每个视图编写不同的键盘处理?

时间:2016-10-16 12:37:43

标签: ios swift nsnotificationcenter uikeyboard

在我的应用程序的主面板中,我有一个textView。当用户按下它时,键盘出现,我必须修改此面板上的约束,以便键盘不会覆盖任何内容。为此,我在该类的viewDidLoad方法中附加了一个观察者:

NSNotificationCenter.defaultCenter().addObserver(self, selector: 
    #selector(keyboardWillChangeFrame),
    name: UIKeyboardWillChangeFrameNotification, object: nil)

然后我有一个方法:

func keyboardWillChangeFrame(notification: NSNotification) {

处理一切。

现在,在不同的面板上,我想以不同的方式修改我的约束,所以我为此准备了一个不同的方法:

func keyboardWillChangeFrameInOtherWay(notification: NSNotification) {

现在为了支持那个观点,我必须将它附加到观察者身上。但是当我在viewDidLoad中写道时:

NSNotificationCenter.defaultCenter().addObserver(self, selector: 
    #selector(keyboardWillChangeFrameInOtherWay), name:        
    UIKeyboardWillChangeFrameNotification, object: nil)

然后当键盘出现在第二个面板上时 - 两个方法都会触发(从第一个面板和第二个面板)。如何为特定面板仅运行一种方法?

2 个答案:

答案 0 :(得分:0)

我无法清楚地理解您的问题,但是您可以访问NSNotification的{​​{1}}字段。如果您将对象传递给NSNotificationCenter,那么您将收到它并且您可以执行一种方法或另一种方法。另一种可能性是每次观察者移除和添加,以便拥有textField的Controller每次只能观察一次...

答案 1 :(得分:0)

我会发布我的答案,因为我在这里发现了问题,我希望这是处理这个问题的最好方法。我在第一个面板上添加了这段代码:

override func viewDidDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

另外,由于它嵌入在导航控制器中,我提出了这个问题:

NSNotificationCenter.defaultCenter().addObserver(self, selector: 
#selector(keyboardWillChangeFrame),
name: UIKeyboardWillChangeFrameNotification, object: nil)

viewWillAppear,现在效果很好。