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

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

目录
相关文章
|
11月前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
647 60
|
11月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1020 4
|
5月前
|
iOS开发
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
126 9
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
|
11月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
12月前
|
Android开发 Swift iOS开发
iOS和安卓作为主流操作系统,开发者需了解两者差异以提高效率并确保优质用户体验。
【10月更文挑战第1天】随着移动互联网的发展,智能手机成为生活必需品,iOS和安卓作为主流操作系统,各有庞大的用户群。开发者需了解两者差异以提高效率并确保优质用户体验。iOS使用Swift或Objective-C开发,强调简洁直观的设计;安卓则采用Java或Kotlin,注重层次与动画。Swift和Kotlin均有现代编程特性。此外,iOS设备更易优化,而安卓需考虑更多兼容性问题。iOS应用仅能通过App Store发布,审核严格;安卓除Google Play外还可通过第三方市场发布,审核较宽松。开发者应根据需求选择合适平台,提供最佳应用体验。
309 3
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
215 1
|
7月前
|
iOS开发 开发者 Windows
uniapp云打包ios应用证书的获取方法,生成指南
打包用到的一共两个文件,一个是p12格式的私钥证书,一个是证书profile文件。其中生成p12证书的时候,按照官网的教程,是需要MAC电脑来协助做的,主要是生成一些csr文件和导出p12证书等。其实这些步骤也可以借助一些其他的工具来实现,不一定使用mac电脑,用windows电脑也可以创建。
925 0
|
11月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
245 2
|
11月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。

热门文章

最新文章