你的位置:首页 > 操作系统

[操作系统]通知中心——键盘的通知


在我们使用的App中,大家都可能见过当编辑的时候键盘会显示出来,当编辑完成的时候点击键盘上面的return,键盘会回收到视图的下面。

这是怎么做到的呢?——通知中心:NSNotificationCenter

* 通知中心:NSNotificationCenter 分为发送和观察者

   俗意:农村大喇叭发送广播 在大喇叭广播之前要有村民(对象) 大喇叭发送广播 村民接收到广播

   大喇叭发送广播:

   - (void)postNotificationName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

   <每一条通知 都是通过通知名字来区分是哪条通知> <发送通知 需要给观察者 一个内容 可以使用object(id) userInfo(字典)>

  村民(观察者)接收广播:

   - (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;

   <接收到广播 观察者可以去做某件事> <观察者接收到通知 执行方法的时候 同时会得到一个通知(NSNotificationCenter)->通知包含:名字 object userInfo>

   村民死了 不再接受广播(移除观察者):

   - (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;

 * 通知可以有一个发送者 可以有多个接收者(观察者)

 * 通知中心实例化对象->[NSNotificationCenter defaultCenter](通知中心方法、单例)

以上就是对通知的介绍,具体怎么操作看代码:

 在AppDelegate.m里面导入ViewController.h文件,创建带有导航栏的窗口

#import "AppDelegate.h"#import "ViewController.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];  self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc]init]];  [self.window makeKeyAndVisible];  return YES;}@end

在ViewController.m文件

#import "ViewController.h"@interface ViewController ()<UITextFieldDelegate>{  UITextField *textField1;}@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  self.view.backgroundColor = [UIColor colorWithWhite:0.800 alpha:1.000];    /*   键盘通知   UIKeyboardWillShowNotification   UIKeyboardDidShowNotification   UIKeyboardWillHideNotification   UIKeyboardDidHideNotification   */    //输入框一直在键盘的上面浮着 如果没有键盘的话 会跟键盘一块到屏幕的最底部  //键盘在显示、消失的时候都会发出两个通知(即将、已经)  textField1 = [[UITextField alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height-44, self.view.frame.size.width, 44)];  textField1.borderStyle = UITextBorderStyleRoundedRect;  textField1.delegate = self;  [self.view addSubview:textField1];      //添加观察者 键盘即将显示的时候 通知名字UIKeyboardWillShowNotification  [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillShowNotification object:nil];  //即将消失  [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardAction:) name:UIKeyboardWillHideNotification object:nil];}- (BOOL)textFieldShouldReturn:(UITextField *)textField{    [textField resignFirstResponder];    return YES;  }- (void)keyboardAction:(NSNotification *)not{    NSLog(@"%@",not.userInfo);    NSDictionary *dic = not.userInfo;  NSLog(@"%@",dic[UIKeyboardFrameEndUserInfoKey]);    //frame是CGRect(结构体)  //字典取出来的内容是id类型->CGRect(结构体)  CGRect frame = [dic[UIKeyboardFrameEndUserInfoKey]CGRectValue];  //获得键盘起始点Y轴的高度  CGFloat y = CGRectGetMinY(frame);  textField1.frame = CGRectMake(0, y-44, self.view.frame.size.width, 44);}@end

效果如下: