1、前期所实现的PlayingCard游戏,其View Controller只能适应PlayingCard这一种游戏规则。而将createDeck函数修改为返回一个nil后,整个View Controller与PlayingCard就没有关系了(同时也就没法运行了),成为了一种抽象的概念(类似于C++中的抽象类),实际的控制器必须派生这个类才能实现自身的功能。
新建一个View Controller类,并实现createDeck方法。此时build工程,无法正常运行。因为当前storyboard关联的依然是那个抽象类。
修改方法:在storyboard最下一栏中选择View Controller,然后在右侧identity inspector(就是右侧栏顶部左起第三个标签),在Class一栏中改为派生类即可。如下图所示:
2、多MVC:
#如何创建:在控件库中拖出一个新的View Controller到storyboard中;新建一个视图控制器类;参考1的方法将storyboard于视图控制器类绑定;
#如何显示多MVC:使用UINavigationController和UITabBarController,这两类的特点是他们的“view”可以是另一个视图控制器;
3、导航控制器UINavigationController:
#适用场合:需要显示多级信息的时候;
#组成元素:导航栏(上面的内容由所VC包含的MVC的navigationItem决定);标题(也是由包含的MVC的title决定);导航栏右侧按键(由包含的MVC的rightBarButtonItem决定)和返回键;地步的工具栏(由包含的MVC的toolBarItems决定);
#segue:由一个MVC进入到另一个MVC的机制,也可以认为是场景切换的机制。
#使用方法:在storyboard中拖入另一个view controller,在前一个viewcontroller的按钮等控件中ctrl+拖动指向第二个viewcontroller,这样就建立起了segue关系。随后选择根视图控制器,将其植入navigation controller中(editor->embed in->navigation controller);
#个性化定义:双击指定子MVC的标题(title);可以在控件库中选择UIBarButtonItem添加到导航栏作为右侧按钮;
#场景切换的函数:
1、准备相关的信息:-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
2、确定切换是否执行:-(BOOL)shouldPerformSegueWithIdentifier:(NSString *) identifier sender:(id)sender;返回NO则不进行切换;不常用;
3、通信方式:在源ViewController中实现prepareForSegue,则可以获得segue.destinationViewController,这样就可对目标ViewController进行操作;
#通过代码来创建导航控制器
1、创建一个ViewController类,命名为RootViewController;在AppDelegate.m中引用其头文件;
2、创建根视图控制器和导航控制器;
3、将导航控制器设为根控制器;完成后的didFinishLaunchingWithOptions如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; //创建根视图控制器 RootViewController *rootViewController = [[RootViewController alloc] init]; //创建导航控制器 UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; //将导航控制器设为根控制器 self.window.rootViewController = navigationController; return YES; }然后运行就会发现根视图出现在了导航控制器开始的位置。
4、添加视图切换的功能:首先在根视图中添加控件,用于控制显示下一个视图控制器,方法是重写loadView:
-(void) loadView { UIView *baseView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; self.view = baseView; baseView.backgroundColor = [UIColor greenColor]; UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [button setTitle:@"Push" forState:UIControlStateNormal]; [button setTintColor:[UIColor whiteColor]]; [button setFrame:CGRectMake(90, 200, 140, 35)]; [button setBackgroundColor:[UIColor purpleColor]]; [button addTarget:self action:@selector(push) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; }在控件的响应函数中,新建并初始化第二个ViewController,并将其push到导航控制器中。
至此,在第一个视图中点击push按钮,导航栏就会进入第二个视图控制器中。需要注意的是,一个导航控制器所控制的多个视图控制器,每一个都可以用
self.navigationController的方法获取到导航控制器;导航栏(NavigationBar)和工具栏(ToolBar)属于导航控制器,但是上面的元素属于各个子视图控制器;
在第二个视图控制器中可以添加返回功能,很简单,让self.navigationController弹出即可。
[self.navigationController popViewControllerAnimated:YES];除了这个基本函数之外,还可以返回至根视图等,详细可见文档。
4触控栏UITabBarController
#触控栏所包含的各个视图控制器是平级关系,不存在前后级的关系;具体的使用方法与导航控制器类似,需要时再详述。