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

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

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

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

目录
相关文章
|
2月前
|
iOS开发 开发者
苹果iOS App Store上架操作流程详解:从开发者账号到应用发布
很多开发者在开发完iOS APP、进行内测后,下一步就面临上架App Store,不过也有很多同学对APP上架App Store的流程不太了解,下面我们来说一下iOS APP上架App Store的具体流程,如有未涉及到的部分,大家可以及时咨询,共同探讨。
|
2月前
|
开发者 iOS开发
iOS应用上架详细图文教程(上)
App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都“死”在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上架流程开始梳理,详细了解下iOS app上架的那些事。
|
2月前
|
Swift iOS开发 开发者
iOS 应用上架流程详解
iOS 应用上架流程详解
|
2月前
|
Android开发 iOS开发 UED
appuploader   iOS 应用自动发布
appuploader   iOS 应用自动发布
|
3月前
|
存储 监控 iOS开发
iOS应用崩溃了,如何通过崩溃手机连接电脑查找日志方法
在iOS应用开发过程中,调试日志和奔溃日志是开发者必不可少的工具。当iOS手机崩溃时,我们可以连接电脑并使用Xcode Console等工具来查看日志。然而,这种方式可能不够方便,并且处理奔溃日志也相当繁琐。克魔助手的出现为开发者带来了极大的便利,本文将详细介绍其功能和使用方法。 克魔助手会提供两种日志,一种是实时的,一种的是崩溃的。(由于崩溃日志的环境很麻烦,目前只展示实时日志操作步骤)
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
算法 iOS开发 UED
iOS如何进行应用的性能优化?
iOS如何进行应用的性能优化?
39 2
|
2月前
|
Linux 数据安全/隐私保护 iOS开发
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
|
26天前
|
安全 数据安全/隐私保护 虚拟化
iOS应用加固方案解析:ipa加固安全技术全面评测
iOS应用加固方案解析:ipa加固安全技术全面评测
36 3
|
1月前
|
运维 监控 安全
应用研发平台EMAS常见问题之sophix ios flutter热更新如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
77 0