随意细解:UI -- MVC、通知
2015-12-17 16:52
786 查看
MVC
Model(模型),存储、处理数据,为应⽤程序提供数据。View(视图),展⽰⽤户界⾯视图,提供⽤户交互,展⽰模型提供的数据。
Controller(控制器),控制视图显⽰,处理⽤户交互,从模型获取数据展⽰在视图上。⺫的是解除模型和视图之间的耦合。
C 和 V 通信
C直接控制VV向C发起通信的⽅式:
- 设置View的target/action
- 设置delegate
- 设置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(观察者),需要监测⼲播信息的对象,即接收信息的对象。
发送通知步骤
1.想接到通知的界面 注册通知2.发送通知(点击方法中)
3.注册完通知,要在适合位置 移除通知(一般 都再dealloc中)
注册
接收信息对象在通知中⼼进⾏注册,包括:信息名称、接收信息时的处理⽅法。(想接到通知的界面)NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(Notification:) name:@"EARTHQUAKE" object:nil];
注销
在dealloc方法中- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:@"EARTHQUAKE" object:nil]; [super dealloc]; }
发送信息
object 发送人 可以不填userInfo 发送通知 携带的数据
// 构建字典 NSDictionary *dic = @{@"name":@"dj"}; [[NSNotificationCenter defaultCenter] postNotificationName:@"EARTHQUAKE" object:self userInfo:dic];
更换皮肤
换皮肤就相当于更换一下根视图控制器。在APPDelegate中的- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions方法中编写代码。(在另一个页面设置一个button,点击方法中发送通知。)设置根视图
RootViewController *rootVc = [[RootViewController alloc]init]; UINavigationController *navCon = [[UINavigationController alloc]initWithRootViewController:rootVc]; self.window.rootViewController = navCon; [rootVc release]; [navCon release];
注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(Notification:) name:@"CHANGECOLOR" object:nil];
选择器Notification方法
- (void)Notification:(NSNotification *)notification { // 1.获取根视图控制器 UIViewController *rootVC = self.window.rootViewController; // 2.取消当前的根视图控制器 self.window.rootViewController = nil; // 3.换肤 导航条 TabBar // appearance 可以把全部 导航条取出来 UINavigationBar *navBar = [UINavigationBar appearance]; // 修改颜色 [navBar setBarTintColor:[UIColor cyanColor]]; // 取出TabBar UITabBar *tabBar = [UITabBar appearance]; [tabBar setBarTintColor:[UIColor cyanColor]]; // 重新设置根视图控制器 self.window.rootViewController = rootVC; }
相关文章推荐
- css:Media Queries
- 控制Arduino的利器-Windows Remote Arduino
- uinavigationcontroller手势返回
- [转!]jQuey中的return false作用是什么
- iOS 一行代码去掉UITableview多余分割线
- 基于easyui的CMS系统的小结
- nutz 结合QueryResult,Record 自定义分页查询,不构建pojo 整合
- 在T-SQL语句中访问远程数据库(openrowset/opendatasource/openquery)
- 遇到的问题-----you can't add a second 'treePath' criteria. Query already contains
- 遇到的问题-----you can't add a second 'treePath' criteria. Query already contains
- 构建灵活的UI之Fragment(二)
- UITouch详解
- 发送验证码时设置UIButton的倒计时
- UICC,USIM卡与SIM的区别
- 手动注册UITableViewCell ID
- ios学习--获取通过UIImagePackerController获取的系统相册 图片&视频 的名称信息
- Android Stuio如何将library项目打包成jar文件
- jsp request 对象详解
- UIImageView绕着某一个点旋转
- MYSQL Starting MySQL. ERROR! Manager of pid-file quit without updating file