在我的项目的第一个UITableViewController场景中,我在单元格中使用UITextFields以使其某些内容可以在运行中进行重命名。当出现键盘并隐藏正在修改的单元格时,我不得不实现通知中心观察者来管理tableView insets。如何仅使用可见视图控制器的方法响应通知?
override func viewDidLoad() {
(...)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWasShown:"), name:UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillBeHidden:"), name:UIKeyboardWillHideNotification, object: nil)
(...)
}
我ASLO投入DEINIT代码删除这些观察员:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self, name:UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name:UIKeyboardWillHideNotification, object: nil)
}
然而,当我执行SEGUE到另一个场景,以及键盘出现我收到运行时异常“致命错误:意外发现零,而用一条线以前的UITableViewController代码的展开的可选值” ,这不应该是活跃在这个场景:
func keyboardWasShown(notification: NSNotification) {
(...)
if let cell = tableView.cellForRowAtIndexPath(editingIndexPath!) as? ListsTableViewCell { // ERROR HERE
(...)
}
}
我想这是因为通知全局运行。但我没想到,目前无形视图的控制器会以自己的功能回应通知。 问题是:如何强制控制器仅在其视图可见时才对通知作出反应。在我的情况下,deinit {}不起作用。
是的!非常感谢您的回答! –