title: 斯坦福大學(xué)iOS公開課筆記(5)--ViewController生命周期和通知
date: 2017-05-20 22:05:57
tags:
這一節(jié)課主要講了ViewController的生命周期,在課程的后半部分還講了通知Notification。在這兩個知識點中間使用了一個字符串屬性設(shè)置的demo進(jìn)行知識點的進(jìn)一步認(rèn)識。
字符串屬性Demo
這個部分主要通過在UITexeView上顯示一段文字,然后在Demo中展示了使用按鈕設(shè)置文字的輪廓以及去除輪廓和點擊按鈕將文字設(shè)置為按鈕的背景色。

設(shè)置字符串屬性一般情況下是使用可變字符串NSMutableAttributedString,修改UITextView中的字符串屬性,一般是通過使用它的textStrong屬性,在其中添加屬性和控制的范圍NSRange。
比如說修改選定字符串的顏色:
- (IBAction)changeBodySelectionColorToMatchBackgroundOfButton:(UIButton *)sender
{
[self.body.textStorage addAttribute:NSForegroundColorAttributeName
value:sender.backgroundColor
range:self.body.selectedRange];
}
還有使用NSMutableAttributedString來設(shè)置一段字符串的屬性
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即為對應(yīng)的值,range后跟著的是需要修改的范圍,比如上邊例子中需要修改的就是選中的部分 self.body.selectedRange。
除了顏色之外,Demo中還講了其他兩種屬性,
NSForegroundColorAttributeName //屬性字符串字符的顏色
NSStrokeColorAttributeName //屬性字符串字符輪廓的顏色
NSStrokeWidthAttributeName //屬性字符串字符輪廓的寬度
ViewController 生命周期
ViewController(以下簡稱VC)的生命周期在iOS開發(fā)中起到了至關(guān)重要的作用,他主要是在程序運行的過程中,在不同的時期使用不同的方法,理解并合理的根據(jù)VC的生命周期進(jìn)行代碼編寫設(shè)計可以起到很好的作用。
viewDidLoad
在整個VC的創(chuàng)建過程中只調(diào)用一次,所以適合放置一些init方法。
因為此時頁面中的幾何方法還沒有確定下來,所以不適合處理一些幾何方面的東西。
- (void)viewDidLoad
{
[super viewDidLoad];
...
}
viewWillAppear
每當(dāng)VC即將顯示在屏幕上給用戶看之前都會調(diào)用的方法,所以可以調(diào)用一些幾何相關(guān)的代碼進(jìn)行設(shè)置,而且只要調(diào)用了viewWillAppear就一定會顯示界面給用戶。
因為會調(diào)用多次,所以并不適合放置一些init方法。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
...
}
viewWillDisappear
當(dāng)頁面即將離開屏幕時調(diào)用,因為即將離開,所以可以在這里調(diào)用一些銷毀對象、停止動畫的方法,來節(jié)省系統(tǒng)資源的占用。并且可以進(jìn)行一些數(shù)據(jù)方面的保存。
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
...
}
viewDidAppear
對應(yīng)viewWillAppear,在頁面出現(xiàn)在屏幕上之后調(diào)用。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
...
}
viewDidDisappear
對應(yīng)viewWillDisappear,在頁面從屏幕上離開后調(diào)用
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
...
}
viewWillLayoutSubViews & viewDidLayoutSubViews
相對于viewWillAppear,更適合于對幾何相關(guān)的操作的方法。
didReceiveMemoryWarning
當(dāng)內(nèi)存占用過高時,會調(diào)用此方法,可以在此方法中添加一些釋放占用內(nèi)存大的對象,比如圖片、聲音、視頻等等。如果你的應(yīng)用時候內(nèi)存過高但是又不釋放內(nèi)存,iOS會將你的應(yīng)用殺掉!
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
...
}
Notification 通知
通知是MVC中很重要的一部分,用于發(fā)送信號告訴其他人我的值發(fā)生了改變,監(jiān)聽者接收到通知之后會做出一些處理。
注冊通知
注冊一個通知需要用到4個參數(shù):
- observer:通知的接受者,一般為viewController,所以我們將通知的注冊寫在控制器中時,這個值對應(yīng)為
self。 - selector:observer中的方法,接收到廣播時調(diào)用。
- name:廣播的名字。
- object:當(dāng)廣播特定對某個對象作用的時候使用。
下邊這個方法就是注冊一個監(jiān)聽系統(tǒng)字體發(fā)生改變的通知,當(dāng)用戶在修改設(shè)置中iOS字體的大小時,就會調(diào)用preferredFontsChangeed:方法進(jìn)行相應(yīng)的處理。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(preferredFontsChangeed:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
移除通知
當(dāng)我們離開這個頁面的時候,我們需要將注冊過的通知移除掉,以免我們的程序發(fā)生問題,這里的參數(shù)基本與注冊通知時一致。
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIContentSizeCategoryDidChangeNotification
object:nil];
