目录
一. 简介
故事板, 用界面的方式来实现UI的创建和显示, 以及界面的跳转
故事板的一些元素:
1)scene(场景): 代表视图控制器和关联的界面
2)segue: 代表视图控制器之间的关系
3)controls:
二. present一个视图控制器
- 第一种方式:建立两个控制器之间的segue, 然后为按钮设置IBAction, 在其中调用- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
- 第二种方式: 直接为A视图控制器中的按钮和B视图控制器建立Segue
- 第三种方式(不使用segue, 而是直接为按钮设置TouchUpInside方法)
三. 导航视图控制器
- 在storyboard文件中, 拖拽一个NavigationController, 勾选"Is Intial View Controller"
- 建立tableView子类, 修改ViewController的Class为所建子类
- 建立UITableViewCell子类, 修改storyboard中tableViewCell的class类型
- 建立模型, 完善cell
- 建立DetailViewController, 在cell与storyboard中的DetailViewController建立segue
修改分隔线的方法
四. 标签栏视图控制器
五. 实例
六. 通知中心
通知中心是NSNotificationCenter类型的对象, 他是一个单例对象
单例类: 在程序运行过程中只会创建一个对象
通知中心里面可以注册(添加)通知对象(NSNotification), 每个通知会有一个名字
可以在添加完成之后发送通知, 注册的通知会响应相应的方法, 执行一些操作
- 某视图在通知中心里面注册(添加)通知对象
- 假设另一个视图中的按钮发送通知
- 注册通知一次,就要相应移除一次
一. 简介
故事板, 用界面的方式来实现UI的创建和显示, 以及界面的跳转
故事板的一些元素:
- scene(场景): 代表视图控制器和关联的界面
- segue: 代表视图控制器之间的关系
- controls:
二. present一个视图控制器
-
第一种方式:建立两个控制器之间的segue, 然后为按钮设置IBAction, 在其中调用
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
// 为按钮1设置响应事件 使其完成跳转 // 第一种跳转方式 // segue - (IBAction)clickAction:(UIButton *)sender { // 跳转到下一个界面 /* 第一个参数: segue的标识符 第二个参数: 需要传递的参数(如果不需要传递可以设为nil) */ [self performSegueWithIdentifier:@"firstSegue" sender:@"first"]; }
-
传参方法(第一种方式和第二种方式都用这种方法传参)
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
// 在跳转到下一个界面之前, 会调用这个方法, 可以用来传值 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { NSLog(@"%s", __func__); // 跳转之前的视图控制器 id sourceCtrl = segue.sourceViewController; // 跳转之后的视图控制器 id destCtrl = segue.destinationViewController; NSLog(@"source: %@\ndest: %@", sourceCtrl, destCtrl); // 传参 if ([destCtrl isKindOfClass:[NextViewController class]]) { NextViewController *nextCtrl = (NextViewController *)destCtrl; nextCtrl.name = sender; NSLog(@"%@", nextCtrl.name); } }
-
-
第二种方式: 直接为A视图控制器中的按钮和B视图控制器建立Segue
* 传参方法(第一种方式和第二种方式都用这种方法传参)`- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender`
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// 跳转之前的视图控制器
id sourceCtrl = segue.sourceViewController;
// 跳转之后的视图控制器
id destCtrl = segue.destinationViewController;
NSLog(@"source: %@\ndest: %@", sourceCtrl, destCtrl);
// 传参
if ([destCtrl isKindOfClass:[NextViewController class]]) {
NextViewController *nextCtrl = (NextViewController *)destCtrl;
nextCtrl.name = sender;
NSLog(@"%@", nextCtrl.name);
}
}
-
第三种方式(不使用segue, 而是直接为按钮设置TouchUpInside方法)
- (IBAction)clickThirdButton:(UIButton )sender {
// 获取storyboard对象
/
第一个参数: storyboard文件的名字
第二个参数: storyboard所在的沙盒目录(传nil表示Main)
*/
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];// 获取�视图控制器对象 /* 参数: 视图控制器的标识符 */ id Ctrl = [sb instantiateViewControllerWithIdentifier:@"MyStoryboardId"]; if ([Ctrl isKindOfClass:[ThirdViewController class]]) { ThirdViewController *thirdCtrl = (ThirdViewController *)Ctrl; thirdCtrl.parameter = @"第三种方式"; // 跳转 [self presentViewController:thirdCtrl animated:YES completion:nil]; } }
三. 导航视图控制器
-
在storyboard文件中, 拖拽一个NavigationController, 勾选"Is Intial View Controller"
-
建立tableView子类, 修改ViewController的Class为所建子类
-
建立UITableViewCell子类, 修改storyboard中tableViewCell的class类型
-
建立模型, 完善cell
-
建立DetailViewController, 在cell与storyboard中的DetailViewController建立segue
如果不是使用storyboard, 需要注册cell再使用
dequeueReusableCellWithIdentifier:<#(NSString > *)#> forIndexPath:<#(NSIndexPath *)#>
注册cell的方法为:
1.self.tableView registerClass:<#(__unsafe_unretained Class)#> forCellReuseIdentifier:<#(NSString *)#>
2.self.tableView registerNib:<#(UINib *)#> forCellReuseIdentifier:<#(NSString *)#>
-
修改分隔线的方法
// 去除分隔线 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // 然后在interface builder中的cell中加一个View
四. 标签栏视图控制器
五. 实例
-
隐藏tabBar的方式
- (IBAction)registerAction:(UIButton *)sender {
// 隐藏TabBar
// self.tabBarController.tabBar.hidden = YES;
self.hidesBottomBarWhenPushed = YES;[self performSegueWithIdentifier:@"registerSegue" sender:nil]; // 显示TabBar self.hidesBottomBarWhenPushed = NO; }
六. 通知中心
-
某视图在通知中心里面注册(添加)通知对象
- (void)gotoNextPage:(UIButton *)sender { SecondViewController *svc = [[SecondViewController alloc] init]; // 获取单例的通知中心对象 NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; SEL action = @selector(changeState:); /* 第一个参数: 是哪个对象关注这个通知(即通知发生时调用这个对象的方法) 第二个参数: 通知发生时调用对象的该方法 第三个参数: 通知的名字(标识符) 第四个参数: 表示只响应该对象里面发送的通知(如果传nil, 表示所有用该名字的通知都会响应, 不管是由哪个类型的对象里面发送的) */ // 注册通知 [center addObserver:self selector:action name:@"changeState" object:nil]; [self.navigationController pushViewController:svc animated:YES]; } // 当有通知发送来时会调用该方法 - (void)changeState:(NSNotification *)notification { // 获取传递过来的参数 NSString *state = notification.userInfo[@"state"]; // 显示 UILabel *stateLabel = (UILabel *)[self.view viewWithTag:200]; stateLabel.text = state; }
-
假设另一个视图中的按钮发送通知
- (void)favouriteAction:(id)sender { // 修改收藏状态 // 发送通知 // 1. 获取通知中心对象 // 2. 发送通知 // 发送的通知只有内存中的对象才能接收 /* 第一个参数: 通知的名字, 要跟注册的时候一致 第二个参数: 发送通知的对象, 传nil都能接收通知 第三个参数: 传递相应的参数值 */ NSDictionary *dict = @{@"state": @"已收藏"}; [[NSNotificationCenter defaultCenter] postNotificationName:@"changeState" object:nil userInfo:dict]; /* //发送通知的另外一种方式 NSNotification notification = [NSNotification notificationWithName:@"changeState" object:self userInfo:dict]; [center postNotification:notification]; */ }
-
注册通知一次,就要相应移除一次
-(void)dealloc { //移除self上面注册的所有对象 [[NSNotificationCenter defaultCenter] removeObserver:self]; // 移除一个通知 //[[NSNotificationCenter defaultCenter] removeObserver:self name:@"changeState" object:nil]; }