iPhone开发学习笔记006—— NSNotification自定义通知名
最近在网上看到一个“在iPhone开发中给键盘加个隐藏工具条”的demo,下下来后,运行后发现,点击“隐藏键盘”之后,之前的TableView不能恢复为应用刚启动时的显示,因为当TextField获得焦点时,会弹出软键盘,相应的需要通过程序调整界面上的TableView,修改其Frame将之上移。(注:TableView中放了五个TextField)。但是点击“隐藏键盘”后,TableView还是维持在其Frame修改之后的样子,没有恢复为应用刚启动时的样子。
尝试过在
- (void)textFieldDidEndEditing:(UITextField *)textField;方法中添加修改TableView的Frame使之恢复启动时显示样子的语句,但是发现只要TextField的焦点发生变化,就会调用这个API,比如从第一个TextField跳到第二个TextField,焦点从第一个切换到第二个,再从第二个切换到第三个,第四个。。。只要任意一个TextField发生失去焦点事件,就会调用这个API。结果造成每发生一次焦点切换,界面就会先恢复应用启动时显示的样子,然后很快又变成Frame被修改之后的样子。
也尝试过注册软键盘显示和隐蔵的通知
发现也是一样,焦点从一个TextField切换到另一个TextField,就会先后发送一次UIKeyboardWillHideNotification和UIKeyboardWillShowNotification通知,还是不能实现想要的效果,即只是在点击了“隐藏键盘”之后,才恢复主界面上TableView显示。
后来想到了自定义通知,才解决这个问题:
Demo里面有个HiddenKeyBoard函数,这个是点击“隐藏键盘”按钮之后会调用的selector,那就在这个里面添加发送通知语句:
[[NSNotificationCenterdefaultCenter]postNotificationName:@"mytest"object:nil];
然后在ViewController的viewWillAppear里面注册这个通知:
- (void)viewWillAppear:(BOOL)animated {
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(doAfterKeyboardbarHidden:)name:@"mytest"object:nil];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
//[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenterdefaultCenter] removeObserver:selfname:@"mytest"object:nil];
[super viewWillDisappear:animated];
}
- (void)doAfterKeyboardbarHidden:(NSNotification*)notification {
//id obj = [notification object];//获取到传递的对象
NSLog(@"++++++ //// +++++");
tableview.frame = CGRectMake(0,40, 320, 340);
}
OK!想要的效果实现了!贴两张图:第一张是输入,输入完就点“隐藏键盘”,马上界面就恢复正常显示了,即第二张图:
![](http://hi.csdn.net/attachment/201202/19/0_13296382176IIi.gif)
![](http://hi.csdn.net/attachment/201202/19/0_1329638232o9r0.gif)