doproio / practice-of-ios

practice-of-ios
24 stars 4 forks source link

【第三章学习笔记】视图控制器的基本概念和用法 #4

Open jeakey opened 10 years ago

jeakey commented 10 years ago

视图控制器的装载

image

这张图清晰的描述了视图控制器的装载过程,有几个注意点:

  1. 当访问view属性时,如果view不存在,则UIViewController会自行调用loadview方法。
  2. 如果想通过代码的方式来实现界面,一般都是需要重写loadview方法,在loadview方法中构建视图。

    视图控制器的生命周期

整个视图控制器的生命周期依次如下:

image

当视图控制器add到window时,会依次调用viewWillAppear(视图将要渲染)和viewDidAppear(视图已经渲染好)

视图卸载

image

当内存警告时,会优先将不活跃的viewcontroller卸载掉。

可以通过模拟器来模拟内存警告。

事件响应

image

事件响应跟js的事件冒泡类似,每次用户的操作的事件都会冒泡,如果程序没有截获,就会丢弃。

特性检测(版本判断)

与js类似,可以判断是否支持某个方法: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来检测方向改变。

// 事件监听
[[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);
}

不同viewController间参数传递

代理


// 定义代理
@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分)。其中参数传递需要用至少两种不同的方式来实现。点击返回按钮,则返回到根视图,如此循环。

fayching commented 10 years ago

小贝 8分 浩杭 12分 bindy 16分 程枫 8分