iOS7应用开发6:UINavigation, UITabbar控制器的多态性

1、前期所实现的PlayingCard游戏,其View Controller只能适应PlayingCard这一种游戏规则。而将createDeck函数修改为返回一个nil后,整个View Controller与PlayingCard就没有关系了(同时也就没法运行了),成为了一种抽象的概念(类似于C++中的抽象类),实际的控制器必须派生这个类才能实现自身的功能。

新建一个View Controller类,并实现createDeck方法。此时build工程,无法正常运行。因为当前storyboard关联的依然是那个抽象类。

修改方法:在storyboard最下一栏中选择View Controller,然后在右侧identity inspector(就是右侧栏顶部左起第三个标签),在Class一栏中改为派生类即可。如下图所示:

iOS7应用开发6:UINavigation, UITabbar控制器的多态性


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到导航控制器中。

iOS7应用开发6:UINavigation, UITabbar控制器的多态性

至此,在第一个视图中点击push按钮,导航栏就会进入第二个视图控制器中。需要注意的是,一个导航控制器所控制的多个视图控制器,每一个都可以用

self.navigationController的方法获取到导航控制器;导航栏(NavigationBar)和工具栏(ToolBar)属于导航控制器,但是上面的元素属于各个子视图控制器;

在第二个视图控制器中可以添加返回功能,很简单,让self.navigationController弹出即可

[self.navigationController popViewControllerAnimated:YES];

iOS7应用开发6:UINavigation, UITabbar控制器的多态性

除了这个基本函数之外,还可以返回至根视图等,详细可见文档。

4触控栏UITabBarController

#触控栏所包含的各个视图控制器是平级关系,不存在前后级的关系;具体的使用方法与导航控制器类似,需要时再详述。

上一篇:Spinner用法案例


下一篇:四层体系结构介绍