斯坦福大学iOS公开课笔记(5)--ViewController生命周期和通知

这一节课主要讲了ViewController的生命周期,在课程的后半部分还讲了通知Notification。在这两个知识点中间使用了一个字符串属性设置的demo进行知识点的进一步认识。

字符串属性Demo

这个部分主要通过在UITexeView上显示一段文字,然后在Demo中展示了使用按钮设置文字的轮廓以及去除轮廓和点击按钮将文字设置为按钮的背景色。

logo

设置字符串属性一般情况下是使用可变字符串NSMutableAttributedString,修改UITextView中的字符串属性,一般是通过使用它的textStrong属性,在其中添加属性和控制的范围NSRange

比如说修改选定字符串的颜色:

1
2
3
4
5
6
- (IBAction)changeBodySelectionColorToMatchBackgroundOfButton:(UIButton *)sender
{
[self.body.textStorage addAttribute:NSForegroundColorAttributeName
value:sender.backgroundColor
range:self.body.selectedRange];
}

还有使用NSMutableAttributedString来设置一段字符串的属性

1
2
3
4
5
6
7
8
NSMutableAttributedString *title =
[[NSMutableAttributedString alloc] initWithString:self.outlineButton.currentTitle];
[title addAttributes:@{NSStrokeWidthAttributeName : @3,
NSStrokeColorAttributeName : self.outlineButton.tintColor}
range : NSMakeRange(0, [title length])];
[self.outlineButton setAttributedTitle:title forState:UIControlStateNormal];

其中NSForegroundColorAttributeName属性为要修改的字符串属性类型,后边的value即为对应的值,range后跟着的是需要修改的范围,比如上边例子中需要修改的就是选中的部分 self.body.selectedRange

除了颜色之外,Demo中还讲了其他两种属性,

1
2
3
NSForegroundColorAttributeName //属性字符串字符的颜色
NSStrokeColorAttributeName //属性字符串字符轮廓的颜色
NSStrokeWidthAttributeName //属性字符串字符轮廓的宽度

ViewController 生命周期

ViewController(以下简称VC)的生命周期在iOS开发中起到了至关重要的作用,他主要是在程序运行的过程中,在不同的时期使用不同的方法,理解并合理的根据VC的生命周期进行代码编写设计可以起到很好的作用。

viewDidLoad

在整个VC的创建过程中只调用一次,所以适合放置一些init方法。

因为此时页面中的几何方法还没有确定下来,所以不适合处理一些几何方面的东西。

1
2
3
4
5
- (void)viewDidLoad
{
[super viewDidLoad];
...
}

viewWillAppear

每当VC即将显示在屏幕上给用户看之前都会调用的方法,所以可以调用一些几何相关的代码进行设置,而且只要调用了viewWillAppear就一定会显示界面给用户。

因为会调用多次,所以并不适合放置一些init方法。

1
2
3
4
5
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
...
}

viewWillDisappear

当页面即将离开屏幕时调用,因为即将离开,所以可以在这里调用一些销毁对象、停止动画的方法,来节省系统资源的占用。并且可以进行一些数据方面的保存。

1
2
3
4
5
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
...
}

viewDidAppear

对应viewWillAppear,在页面出现在屏幕上之后调用。

1
2
3
4
5
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
...
}

viewDidDisappear

对应viewWillDisappear,在页面从屏幕上离开后调用

1
2
3
4
5
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
...
}

viewWillLayoutSubViews & viewDidLayoutSubViews

相对于viewWillAppear,更适合于对几何相关的操作的方法。

didReceiveMemoryWarning

当内存占用过高时,会调用此方法,可以在此方法中添加一些释放占用内存大的对象,比如图片、声音、视频等等。如果你的应用时候内存过高但是又不释放内存,iOS会将你的应用杀掉!

1
2
3
4
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
...
}

Notification 通知

通知是MVC中很重要的一部分,用于发送信号告诉其他人我的值发生了改变,监听者接收到通知之后会做出一些处理。

注册通知

注册一个通知需要用到4个参数:

  • observer:通知的接受者,一般为viewController,所以我们将通知的注册写在控制器中时,这个值对应为self
  • selector:observer中的方法,接收到广播时调用。
  • name:广播的名字。
  • object:当广播特定对某个对象作用的时候使用。

下边这个方法就是注册一个监听系统字体发生改变的通知,当用户在修改设置中iOS字体的大小时,就会调用preferredFontsChangeed:方法进行相应的处理。

1
2
3
4
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(preferredFontsChangeed:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];

移除通知

当我们离开这个页面的时候,我们需要将注册过的通知移除掉,以免我们的程序发生问题,这里的参数基本与注册通知时一致。

1
2
3
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIContentSizeCategoryDidChangeNotification
object:nil];
logo