iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面是我的一些经验。
一、结构
按结构可以对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会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。
注:细心的同学应该能发现,在Xcode中新建一个ViewController时,只可以选择继承自UIViewController和UITableViewController,而它们都是第一种。
图1
二、Controller和View的生命周期
这里指的View是指Controller的View。它作为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。
图2 ViewController生命周期
当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view以及创建好了。
当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。
当view不在使用,而且是disappeared,受到内存警告时,如果你是通过nib载入的viewController或者在loadView方法里调用了super loadView,那么viewController会将view释放并将其指向nil,然后调用viewDidUnload。
三、代码组织(如何设计良好的viewcontroller)
ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
1、init里不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2、loadView中只初始化view,一般用于创建比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。
3、viewDidLoad 这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view,参见图2)。
4、viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5、viewDidAppear 一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6、viewDidUnload 这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。
From http://xcodev.com/341.html
分享到:
相关推荐
### ViewController的生命周期分析和使用 #### 一、结构概述 在iOS SDK中,ViewController作为界面控制器的核心组件之一,被广泛应用于各种应用的开发之中。为了更好地理解和使用ViewController,我们可以将其分为...
这通常涉及到重写或实现一些特定的方法,如`viewDidLoad()`,`viewWillAppear()`,`viewDidAppear()`等生命周期方法,以及`prepare(for:sender:)`来处理页面间的跳转。 在`MNTabbarDemo`中,每个页面可能有自己的...
8. **View Controller Life Cycle**:理解ViewController的生命周期对性能的影响,比如在适当的时候禁用不必要的更新,减少视图层次结构,都可能提升FPS。 9. **Auto Layout性能**:复杂的Auto Layout约束可能导致...
8. **生命周期**:ViewController有自己的生命周期,包括初始化、加载视图、显示视图等阶段,理解这些阶段对于正确处理数据和更新界面至关重要。 9. **协议和代理**:在iOS开发中,协议常用来定义不同对象间如何...
理解ViewController的生命周期,如初始化、加载视图、显示、销毁等状态,可以帮助开发者有效地管理资源和响应用户操作。 iOS应用还需要处理数据存储,包括使用SQLite数据库、Core Data框架或者云服务。Core Data是...
8. **App生命周期和状态管理**: iOS应用有多种生命周期状态,如初始化、激活、后台运行和退出。开发者需要确保在不同状态下正确保存和恢复游戏状态,以提供良好的用户体验。 9. **测试与调试**: Xcode内置了...
8. **ViewController生命周期**:在启动动态效果时,开发者需要在合适的生命周期方法(如`viewDidLoad`、`viewWillAppear`或`viewDidAppear`)中添加动画代码,确保在正确的时间点显示动画。 9. **响应式设计**:...
在iOS中就是ViewController的生命周期,在Android中就是Activity/Fragment 的生命周期。这样其实非常简单了,我们只要根据我们的需求去hook一些生命周期的方法就行了。在iOS 中我们可以使用runtime的method swizzle ...
在iOS应用开发中,视图控制器(UIViewController)是构建用户界面的核心组件,它负责管理一个或多个视图的生命周期和行为。本资源“ios应用源码之视图控制器(无动画版)20181210”提供了一个基础的、不包含动画效果...
- 了解AppDelegate和ViewController中的生命周期方法可以帮助开发者更好地管理应用的状态和资源,特别是在处理内存管理和后台处理时。 4. **界面设计与用户体验:** - iOS应用非常注重美观的界面和优秀的用户体验...
iOS开发者则需要了解iOS的视图控制器(ViewController)、应用生命周期以及如何使用Xcode进行项目管理和调试。 集成开发环境(IDE)的选择对于提升开发效率起到关键作用。对于Android开发者来说,Android Studio提供...
- ViewController的生命周期方法,如`viewDidLoad`和`viewWillAppear`,将在倒计时应用中起到关键作用。开发者需要在适当的方法中初始化定时器,并在视图消失时取消或暂停它。 10. **用户交互反馈**: - 为了提供...
6. **生命周期方法**:在ViewController类中,我们可能会发现如`application(_:didFinishLaunchingWithOptions:)`或`viewDidLoad()`等生命周期方法的使用。这些方法是控制启动屏幕显示时间的关键,开发者通常在这里...
移动应用开发是一个涵盖广泛领域的主题,它涉及到使用各种编程语言和...通过这个综合实训,你不仅会获得扎实的编程技能,还能理解移动应用开发的完整生命周期,从需求分析到上线维护,为你的未来职业生涯打下坚实基础。
2. `AppDelegate.swift` 或 `AppDelegate.m`: 应用程序的代理,负责初始化和管理应用的生命周期。这里可能会有与界面初始化或图片资源加载相关的设置。 3. `FilterManager.swift` 或 `FilterManager.m`: 这可能是一...
C`(应用委托类,处理应用生命周期事件)、`ViewController`(视图控制器,控制界面交互)、`Storyboard`(界面布局文件)、`Model`(数据模型,存储和处理数据)、`Service`(网络请求和服务接口)以及`Utils`...
在实际项目中,我们还会遇到生命周期管理,比如ViewController的生命周期方法,如`viewDidLoad`、`viewWillAppear`等。另外,iOS应用的权限管理也是重要一环,例如访问用户位置、照片库或推送通知等,都需要获取用户...
9. **第三方库集成**:如果存在`Pods`目录,会涉及CocoaPods的使用和第三方库的集成。 10. **App生命周期**:通过AppDelegate学习应用启动、暂停、恢复和终止等生命周期事件的处理。 11. **网络请求**:可能包含网络...
同时,此项目也是理解iOS应用生命周期、多线程编程以及优化游戏性能的好例子。无论你是初学者还是有经验的开发者,这个开源项目都能提供宝贵的学习资源,帮助你在iOS游戏开发的道路上更进一步。
6. **生命周期管理**:UIViewController遵循特定的生命周期,包括初始化、加载视图、显示、隐藏和销毁等阶段,开发者需要在相应的方法中编写相应的代码。 7. **内存管理**:在内存压力下,系统可能会销毁视图控制器...