Open jeakey opened 10 years ago
这张图清晰的描述了视图控制器的装载过程,有几个注意点:
整个视图控制器的生命周期依次如下:
当视图控制器add到window时,会依次调用viewWillAppear(视图将要渲染)和viewDidAppear(视图已经渲染好)
当内存警告时,会优先将不活跃的viewcontroller卸载掉。
可以通过模拟器来模拟内存警告。
事件响应跟js的事件冒泡类似,每次用户的操作的事件都会冒泡,如果程序没有截获,就会丢弃。
与js类似,可以判断是否支持某个方法:respondsToSelector:@selector(function)
respondsToSelector:@selector(function)
如果需要判断系统版本,可以通过以下方式获取:
if([[UIDevice currentDevice].systemVersion floatValue] < 6.0){ //6.0以下版本的处理 }else{ //6.0以上版本的处理 }
可以通过以下方式来检测和禁用旋转方向:
// 这个方法是6.0以下的方法,return NO;则不旋转屏幕 - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) toInterfaceOrientation { return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } // 6.0以上将上面的方法拆分为以下两个方法: // 这个方法return NO;则不旋转屏幕 - (BOOL) shouldAutorotate { return YES; } // 这个方法用来指定支持哪个方向 - (NSUInteger) supportedInterfaceOrientations { return UIInterfaceOrientationMaskAllButUpsideDown; } // 任何版本都支持。屏幕将要旋转过来时调用,如果上面方法return NO;则不调用,一般在这里做横屏适应 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ }
除了这些方式,也可以通过监听UIDeviceOrientationDidChangeNotification来检测方向改变。
UIDeviceOrientationDidChangeNotification
// 事件监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientation:) name:UIDeviceOrientationDidChangeNotification object:nil]; - (void)deviceOrientation:(NSNotification *)notification { UIDevice *device = (UIDevice *)[notification object]; // 获取屏幕旋转的方向 NSLog(@"device : %d",device.orientation); }
// 定义代理 @protocol ModalViewControllerDelegate<NSObject> - (void)changeLabelText:(NSString *)text; @end // 定义好以后要使相应的类实现这个代理。 // 在需要代理的地方定义这个代理对象 @property (nonatomic,assign) id <ModalViewControllerDelegate> delegate; // 调用代理方法 [self.delegate changeLabelText:@"text"];
通知的方式很简单,但是通知应用频繁容易使逻辑混乱,因为通知是其他类没有关联性。
// 发布通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeLabelTextNotification" object:@"text"]; // 通知监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLabelText:) name:@"ChangeLabelTextNotification" object:nil];
新建单视图项目,使用代码的方式(4分)构建一个5*8黑白相间的全屏网格(8分),点击每个格子都弹出一个模态视图(12分),模态视图上包含一个返回按钮和一个label,label显示点击了第n个格子(n为点击的格子在网格中的位置)(16分)。其中参数传递需要用至少两种不同的方式来实现。点击返回按钮,则返回到根视图,如此循环。
点击了第n个格子
小贝 8分 浩杭 12分 bindy 16分 程枫 8分
视图控制器的装载
这张图清晰的描述了视图控制器的装载过程,有几个注意点:
视图控制器的生命周期
整个视图控制器的生命周期依次如下:
add view
当视图控制器add到window时,会依次调用viewWillAppear(视图将要渲染)和viewDidAppear(视图已经渲染好)
视图卸载
当内存警告时,会优先将不活跃的viewcontroller卸载掉。
可以通过模拟器来模拟内存警告。
事件响应
事件响应跟js的事件冒泡类似,每次用户的操作的事件都会冒泡,如果程序没有截获,就会丢弃。
特性检测(版本判断)
与js类似,可以判断是否支持某个方法:
respondsToSelector:@selector(function)
如果需要判断系统版本,可以通过以下方式获取:
屏幕旋转
可以通过以下方式来检测和禁用旋转方向:
除了这些方式,也可以通过监听
UIDeviceOrientationDidChangeNotification
来检测方向改变。不同viewController间参数传递
代理
通知
通知的方式很简单,但是通知应用频繁容易使逻辑混乱,因为通知是其他类没有关联性。
本章作业
新建单视图项目,使用代码的方式(4分)构建一个5*8黑白相间的全屏网格(8分),点击每个格子都弹出一个模态视图(12分),模态视图上包含一个返回按钮和一个label,label显示
点击了第n个格子
(n为点击的格子在网格中的位置)(16分)。其中参数传递需要用至少两种不同的方式来实现。点击返回按钮,则返回到根视图,如此循环。