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];
实现效果