一.MVC 
Model - View - Controller
即  模型 - 视图 - 控制器
Modle (模型) 存储 处理数据 为应用程序提供数据.
View (视图)展示用户界面视图,提供用户交互 展示模型提供的数据.
Controller (控制器) 控制视图显示 处理用户交互 从模型获取数据展示在视图上 目的是解除迷行和视图之间的耦合.
C向M提出需求,直接使用M提供的数据
M向C发起通信方式:KVO  通知  ,可以在 M 发生变化时通知 C
C 负责读取M提供的数据 负责监控M的变化并进行处理
V 和 M 禁止通信
MVC 的优势:
1). 实现低耦合,减少视图和控制器之间复杂冗余的代码.
2). 提高重用性, 多个视图可以共享一个模型,多个控制器可以共享一个视图.
3). 更易于维护,M V C 独立,可以分别处理不同的变化
二. 通知
通知模式: 一个对象能够给其他任意数量的对象广播信息, 对象之间可以没有耦合关系.
NSNotification (通知),封装了要广播的信息.
NSNotificationCenter (通知中心), 管理注册接收消息对象,广播消息.
observer (观察者), 需要监测广播信息的对象,即接收信息的对象.
接收信息对象在通知中心进行注册, 包括: 信息名称, 接收信息时的处理方法.
对象通过通知中心广播信息,包括: 信息名称 信息内容等.
已经注册过的对象如果不需要接收信息时, 在通知中心注销.
一共分三个步骤:
 1). 注册
// 注册一条通知 (接受方,接受参数的)
    // 单例类 对象 通知中心  [NSNotificationCenter defaultCenter]
    // 通知的名字全是大写的
   
    // 注册的时候 object 就填 nil
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(actionNotifitation:) name:@"NOTIFICATIONONE" object:nil];
   
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(actionNotifitation:) name:@"NOTIFICATIONTWO" object:nil];
接收信息: 
// 实现接受通知的方法
- (void)actionNotifitation:(NSNotification *)notification
{
    if ([notification.name isEqualToString:@"NOTIFICATIONONE"]) {
        // 1. 把 windows 的rootVC 取出来
       
        UIViewController *vc = self.window.rootViewController;
       
       
        // 2. 把已经设置window 的rootVC 重置为空
       
       
        self.window.rootViewController = nil;
        // 3. 设置皮肤
        // 取出NAVBar 和 tabBar
        // 通过调用 appearance 取出 要更改的Bar
        UINavigationBar *navBar = [UINavigationBar appearance];
        UITabBar *tabBar = [UITabBar appearance];
       
        // 更改颜色
        [navBar setBarTintColor:[UIColor redColor]];
        [tabBar setBarTintColor:[UIColor redColor]];
        // 4. 重新赋值 window 的根视图控制器
        self.window.rootViewController = vc;
    } else if ([notification.name isEqualToString:@"NOTIFICATIONTWO"]){
        UIViewController *vc = self.window.rootViewController;
        self.window.rootViewController = nil;
        UINavigationBar *navBar = [UINavigationBar appearance];
        UITabBar *tabBar = [UITabBar appearance];
        [navBar setBarTintColor:[UIColor grayColor]];
        [tabBar setBarTintColor:[UIColor grayColor]];
        self.window.rootViewController = vc;
    }
   
    // 接受发过来的信息(携带的参数)
    NSDictionary *dic = notification.userInfo;
    NSLog(@"我收到通知了%@, 通知的名字:%@, object:%@", dic, notification.name, notification.object);
}
 2). 发送信息
- (void)actionButton1:(UIButton *)button
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATIONTWO" object:nil userInfo:nil];
}
// 发送通知
- (void)actionButton:(UIButton *)button
{
   
    // 发送一条通知  名字必须一样 否则接受不到
   
    // userInfo 才是携带的参数 是个字典
   
    // 构建一个字典
   
    // object 一般 nil
   
    // 携带参数就放字典里面
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATIONONE" object:self userInfo:@{@"UI":@"Over"}];
}
 3). 注销
- (void)dealloc
{
    // 页面被销毁的时候,就把通知销毁
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"NOTIFICATIONONE" object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"NOTIFICATIONTWO" object:nil];

[_window release];
    [super dealloc];

}

UI一揽子计划 24 (MVC、通知、)相关推荐

  1. UI一揽子计划 9 (UITableView 、UITableView 、重用机制)

    一. UITableView UITableView继承自UIScrollView,所以可以滚动 表视图的每⼀一条数据都是显示在UITableViewCell对象中 表视图可以分区显⽰示数据,每个分区 ...

  2. UI一揽子计划 1 (UIView UILabel)

    第一天 1.UIView ·建立一个空模板后,首先将ARC模式关闭,因为iOS采用MRC模式,即手动管理内存. ·重写dealloc方法. - (void)dealloc { [_window rel ...

  3. UI一揽子计划 22 (多线程概述、NSThread、NSOperationQueue 、GCD、多线程管理)

    一.多进程概述:     进程: 一个正在运行的程序 叫做一个进程     多进程: 多个程序正在运行 叫做多线程     线程: 一个进程 都会有一个或多个线程 如果只有一个 叫做主线程  主线程负 ...

  4. UI一揽子计划 17 (image的异步加载、KVO观察者模式、KVO进行豆瓣列表界面图片的异步加载)

    把下载图片的封装起来    ImageDownloader.h #import <Foundation/Foundation.h> @protocol ImageDownloaderDel ...

  5. UI一揽子计划 8 (UINavigationController 、界面通信 、NSTimer  、NSUserDefaults)

    一.UINavigationController       //  创建一个导航控制器     // 创建一个控制器作为根控制器 去管理     RootViewController *rootVC ...

  6. UI一揽子计划 14 (拖控件 、)

    - (void)viewDidLoad {     [super viewDidLoad];         // 注册cell         // 如果使用Xib 文件加载cell 的话 一定要注 ...

  7. UI一揽子计划 2 (UITextField  UIButton)

    UItextField 一.创建一个UITextField时候默认就弹出键盘     1 对齐方式     textField.textAlignment = NSTextAlignmentCente ...

  8. UI一揽子计划 11 (自定义UITableViewCell、Cell 的自适应高度)

    一. 自定义UITableViewCell 在日常的编程中,系统提供的几种Cell 样式 往往不能满足我们的需求.所以需要我们给它进行自定义样式. 自定义Cell 就是创建一个UITableViewC ...

  9. UI一揽子计划 12 (模态ViewController、单例、通讯录实战、)

    一.模态ViewController 程序中切换⻚面,可以使⽤用UINavigationController.通过导航功能实现⻚面切 换. 某种情况下,可以使⽤视图控制器的一对⽅法实现切换⻚面 1.p ...

最新文章

  1. Meizu M8 Preview
  2. 计算机网络与通信基础知识,计算机网络与通信基础/谢雨飞
  3. python中yield的用法
  4. django按钮点击后想刷新当前页面的view写法
  5. 关闭Eclipse光标悬浮自动提示
  6. 容器中Java RAM的使用:不会丢失内存的5大技巧
  7. MYSQL安装时解决要输入current root password的方法
  8. AutoHotKey在魔兽中显示文字或图片
  9. GitHub 开源官方命令行工具登顶 TOP1,5 分钟极速上手!
  10. 3年后,基于mysql控制vsftp的用户认证机制
  11. IIS 发布网站无法显示CSS、背景及图片文件---另一个思路--终极方案
  12. python代码敲写英雄联盟排列
  13. Win11此应用无法在你的电脑上运行怎么解决
  14. php guzzlehttp,使用Guzzle执行HTTP请求
  15. 微信小程序背景图片真机不显示问题
  16. 书摘—做自己的公关专家
  17. 【JQuery】使用JQuery实现城市两级或三级联动(下拉菜单)
  18. 功能需要富文本编译器图片不转base64,琢磨了一下,上代码
  19. 5种数据分析常用的思维方法!
  20. Android 滚动字幕实现

热门文章

  1. 放弃MBP,用 8GB 的树莓派4 工作一天,是这样的感受!
  2. 笔记系列-----oracle中表的几种类型
  3. hexo博客插入音乐播放器
  4. 开机logo bmp gif_比支付宝还蓝?腾讯 QQ 简洁版 TIM 更新 LOGO
  5. 自动跳格的验证码输入
  6. BigDecimal基本知识
  7. C++中为什么使用bool类型
  8. 为什么CPU流水线会提高代码执行效率?
  9. 15-2.1 面试核心部分要点(基础部分给新手看的,祝莘莘学子早日学业有成) --不要害怕Java难,这两章掌握了,Java基础就掌握了
  10. 莫等闲,白了少年头,空悲切。