iOS开发之UIViewController

2023-11-04 08:58
文章标签 开发 ios uiviewcontroller

本文主要是介绍iOS开发之UIViewController,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


http://blog.csdn.net/xyz_lmn/article/details/9022399


  ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,ViewController管理应用中的众多视图。iOS的SDK中提供很多原生ViewController,以支持标准的用户界面,例如表视图控制器(UITableViewController)、导航控制器(UINavigationController)、标签栏控制器(UITabbarController)和iPad专有的UISplitViewController等。


        按结构可以对iOS的所有ViewController分成两类:
        1、主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
        2、用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,因此后一个ViewController一般会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。

ViewController使用

UIViewController可以使用两种方式创建,1、xib方式,2、代码方式

        1)xib方式

        Command+N 新建文件,选Cocoa Touch UIViewController subclass,SubClass of UIViewController,勾选with XIB for user interface。定义ViewController名字是MainViewController,最终生成MainViewController.h MainViewController.m MainViewController.xib三个文件。在AppDelegate.m文件的

didFinishLaunchingWithOptions方法中加载xib文件。


加载xib文件后,在xib文件拖拽几个控件可看到效果。


           2)代码创建

       Command+N 新建文件UIViewController文件,在AppDelegate.m文件的didFinishLaunchingWithOptions方法中使用。在UIViewController的loadView方法中使用代码创建view。

ViewController的生命周期

       前面写了iOS应用程序的生命周期,这里会写到ViewController的生命周期,这个更像Android的Activity的生命周期(见文章最后的图)。ViewController生命周期会经历初始化、加载视图、销毁视图、生命结束等过程。

1)init方法

      初始化ViewController本身。

2)loadView方法

      当view需要被展示而它却是nil时,viewController会调用该方法。

      如果代码维护View的话需要重写此方法,使用xib维护View的话不用重写。

      

3)viewDidLoad方法

      执行完loadView后继续执行viewDidLoad,loadView时还没有view,而viewDidLoad时view已经创建好了。

4)viewDidUnload方法

     当系统内存吃紧的时候会调用该方法,内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式。

      在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release view时已经将其release掉了)。

      在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等。

      一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行。

5)dealloc

      释放其他资源或内存。


viewController的生命周期图

ViewController加载view过程,见下图(loadView)

1)loadView


ViewController卸载View过程见(unLoadView)

2)unLoadView







http://www.jianshu.com/p/99f37dac2e8c

对于初学者来说往往无法弄清iOS中各种各样的Controller之间的关系和使用场景。这篇文章将尝试整理各个Controller的用法以及注意事项。

主要介绍的Controller有:

  • UIViewController
  • UINavigationController
  • UITabBarController
  • ModalViewController
  • ChildViewController

UIXXXController之间的关系

对于各个Controller之间的关系我想从下图开始讲解:

img
img

程序的入口是main()这个大家都知道,iOS也不例外也是在main
里面:

int main(int argc, char * argv[]) {@autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}

对于这个main里面干了什么事情与这篇文章的主题不太符合,初学者可能也不太能理解,感兴趣的可以去了解一下runloop,我们只要知道在这之后,我们的APP将要执行的类就到了AppDelegate,并且我们的代码也是从这里开始。

与我们今天主题最相关的就是下面一段了:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.self.rootViewController = [[UIViewController alloc] init];[self makeKeyAndVisible];return YES;
}

这段代码设置就是iOS程序里启动后显示的第一个ViewController,接下来的流程就全由你自己控制了。

PS:在Xcode5 之后默认使用storyboard不需要在这里写任何代码就会有显示默认的ViewController,那时因为在info.plist中选择使用Main.storyboard的initialViewController作为初始ViewController。

对于一个iOS的APP来讲第一个UIViewController的类型是非常重要的,它将决定这个APP的UI架构和层级。

我们就从Xcode自带的3个典型模板工程去分析和讲解。

img
img

如图,Xcode创建工程时有几组模板工程可以选择:Master-Detail ApplicationSingle View ApplicationTabbed Application。其中创建后对应的rootViewController分别为:

  • Master-Detail Application ---> UINavigationController
  • Single View Application ---> UIViewController
  • Tabbed Application ---> UITabbarController

PS:Page-Based Application在今天的主题中暂不讨论





http://wongkoo.github.io/2015/07/28/UIViewController/


- (void)loadView;

This is where subclasses should create their custom view hierarchy if they aren’t using a nib. Should never be called directly.
如果没有使用Nib,那么子类应该实现该方法创建视图层。永远不要直接调用它!

使用IB的时候,不要覆写该方法。

调用

不应该被直接调用。那什么时候被调用?
每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。

作用

loadView方法是用来负责创建UIViewController的view

默认实现

1、它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view
初始化中指定某xib,显式初始化

1
[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];

如果没有明显的传xin文件名,就会加载跟UIViewController相同文件名的xib文件。

1
[[MJViewController alloc] init]; // 加载MJViewController.xib

2、如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性,大致如下

1
2
3
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

//applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}
使用

如果想通过代码来创建UIViewController的View,就要重写loadView方法,并且不需要调用[super loadView],因为若没有xib文件,[super loadView]默认会创建一个空白的UIView。
我们既然要通过代码来自定义UIView,那么就没必要事先创建一个空白的UIView,以节省不必要的开销。正确的做法应该是这样:

1
2
3
- (void)loadView {  
     self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];  
}

不需要调用[super loadView],你调用了也不会出错,只是造成了一些不必要的开销。
总结一句话,苹果设计这个方法就是给我们自定义UIViewController的View用的。



Android程序员 如何入门iOS ——UIViewController 和 Layout System


https://segmentfault.com/a/1190000004334654

这篇关于iOS开发之UIViewController的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/344649

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T