UI基础-MVC、通知

MVC

  • Model(模型),存储、处理数据,为应用程序提供数据。
  • View(视图),展示用户界面视图,提供用户交互,展示模型提供的
    数据。
  • Controller(控制器),控制视图显示,处理用户交互,从模型获取数据展示在视图上。目的是解除模型和视图之间的耦合。

C和V通信

  • C直接控制V。例如:在Controller中创建一个UIButton。
  • V向C发起通信的方式:
  • 设置View的target/action,例如设置UIButton的target/action。
  • 设置delegate,例如设置UITextField、UIAlertView代理。
  • 设置dataSource,例如设置UITableView的dataSource。
  • C负责处理V产生的事件。

C和M通信

  • C向M提出需求,直接使用M提供的数据。
    • M向C发起通信方式:KVO、通知,可以在M发生变化时通知C。
    • C负责读取M提供的数据,负责监控M的变化并进行处理。

V和M通信

  • V和M禁止通信。
  • C负责M和V之间的通信。C从M获取数据,将数据显示在View上。

MVC的优势

  • 实现低耦合,减少视图和控制器之间复杂冗余的代码。
  • 提高重用性,多个视图可以共享一个模型,多个控制器可以共享一个视图。
  • 更易于维护,M、V、C独立,可以分别处理不同的变化。

通知

  • 通知模式:一个对象能够给其他任意数量的对象广播信息。对象之
    间可以没有耦合关系。
  • NSNotification(通知),封装了要广播的信息。
  • NSNotificationCenter(通知中心),管理注册接收消息对象,广播消息。
  • observer(观察者),需要监测广播信息的对象,即接收信息的对象。

使用方法

  • 接收信息对象在通知中心进⾏行注册,包括:信息名称、接收信息
    时的处理方法。
// 注册 
[[NSNotificationCenter defaultCenter] addObserver:注册对象
selector:@selector(⽅方法名) name:信息名称 object:nil];
  • 对象通过通知中心广播信息,包括:信息名称、信息内容。
// 发送信息
[[NSNotificationCenter defaultCenter] postNotificationName:信息名称 object:发信息对象 userInfo:发送消息时 传递的信息];
  • 已经注册过的对象如果不需要接收信息时,在通知中心注销。
// 注销 
[[NSNotificationCenter defaultCenter] removeObserver:注销
对象 name:信息名称 object:nil];

懒加载的概念

  • 如果你没有用到这个对象的话 就不加载 用到的话 才会去加载

实现换皮肤功能

创建新工程

这里写图片描述

为第四个界面添加两个按钮

在第四个界面中发送通知

- (void)buttonClick:(UIButton *)button
{
    // 发送通知步骤:
    // 1.想接到通知的界面注册通知
    // 2.发送通知(点击方法中)
    // 3.注册完通知 要在适合的位置 移除通知 (一般都在dealloc中)

    // 发送通知
    // object  发送人 可以不填
    // userInfo  发送通知 携带的数据
    NSDictionary *dic = @{@"name":@"jtt"};
    [[NSNotificationCenter defaultCenter] postNotificationName:@"EARTHQUAKE" object:self userInfo:dic];


}

在要接收通知的页面注册通知

// 更换皮肤 注册通知 要知道什么时候更换
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification:) name:@"EARTHQUAKE" object:nil];
    // 注册通知2
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification:) name:@"FLOOD" object:nil];

    // 换皮肤 就相当于 更换一下 根视图控制器
    RootViewController *rootVC = [[RootViewController alloc] init];
    self.window.rootViewController = rootVC;
    [rootVC release];

实现方法

- (void)notification:(NSNotification *)notification
{
    NSLog(@"我是APPDelegate");
    if ([notification.name isEqualToString:@"EARTHQUAKE"]) {
        // 1.获取根视图控制器
        UIViewController *rootVC = self.window.rootViewController;
        // 2.取消当前的根视图控制器
        self.window.rootViewController = nil;
        // 3.换皮肤  导航条 和 tabBar
        // appearance 可以把全部 导航条取出来
        UINavigationBar *navBar = [UINavigationBar appearance];
        // 修改颜色
        [navBar setBarTintColor:[UIColor yellowColor]];
        // 取出tabBar
        UITabBar *tabBar = [UITabBar appearance];
        // 修改颜色
        [tabBar setBarTintColor:[UIColor yellowColor]];

        // 重新设置根视图控制器
        self.window.rootViewController = rootVC;
    } else {
        // 1.获取根视图控制器
        UIViewController *rootVC = self.window.rootViewController;
        // 2.取消当前的根视图控制器
        self.window.rootViewController = nil;
        // 3.换皮肤  导航条 和 tabBar
        // appearance 可以把全部 导航条取出来
        UINavigationBar *navBar = [UINavigationBar appearance];
        // 修改颜色
        [navBar setBarTintColor:[UIColor orangeColor]];
        // 取出tabBar
        UITabBar *tabBar = [UITabBar appearance];
        // 修改颜色
        [tabBar setBarTintColor:[UIColor orangeColor]];

        // 重新设置根视图控制器
        self.window.rootViewController = rootVC;

    }   
}

注销通知

// 一般在dealloc中
// 移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"EARTHQUAKE" object:nil];

实现效果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值