斯坦福大學(xué)iOS開發(fā)公開課總結(jié)(四 & 五) :屬性字符串Demo

2016.07.04日更新:

因為第四節(jié)課和第五節(jié)課內(nèi)容相似既忆,故合并在一起漱凝,為了使學(xué)習(xí)總結(jié)的序號和課程的一致性吼肥,更正了標(biāo)題乌叶。


本節(jié)課講解了iOS框架里幾個重要的知識點:動態(tài)綁定跷敬,控制器的生命周期讯私,屬性字符串等。最后演示了一個Demo用來講解屬性字符串的幾個功能西傀。

動態(tài)綁定


在OC的編譯期斤寇,所有的指針都是id類型,只有在運行時拥褂,對象的類型才會被確定娘锁。

舉個?? :
在編譯期,NSString* 實際上與id相同饺鹃,但是加上去的好處是讓編譯器知道你至少是意圖讓該指針指向一個字符串致盟。所以如果嘗試發(fā)送非字符串消息給該指針,它會發(fā)出警告尤慰,但是不會提示錯誤馏锡,仍可以通過編譯。但是如果在運行時就會“露餡”伟端,因為此時如果向該對象發(fā)送非字符串消息時杯道,就會引起崩潰。

再舉個具體的??:

NSString *hellow = @"hello";
Ship *hellowShip = (Ship *)hello;
[helloShip shoot];

編譯器會認(rèn)為hellowShipship類型,因此向hellowShip發(fā)送shoot消息時党巾,在編譯器期是可以通過的萎庭。
但是,hellowShip實際上指向的是字符串齿拂,所以會導(dǎo)致在運行時崩潰驳规。

所以就引出了類型保護(hù)機制用來確定對象的類型:

類型保護(hù)機制


沒有添加類型保護(hù)機制:

PlayingCard *otherCard = [otherCards firstObject];
[otherCard play];

firstObject 方法返回的是id類型,這里需要保護(hù)機制確保取出的對象是PlayingCard的實例署海,以防止向其發(fā)送消息時導(dǎo)致程序崩潰吗购。

添加了類型保護(hù)機制:

PlayingCard *otherCard = [otherCards firstObject];

id card = [otherCards firstObjct];
if ([card isKindOfClass:[PlayingCard class]])
{
   PlayingCard *otherCard = (PlaytingCard *)card;
   [otherCard play];

}

我們可以看到card指針通過isKindOfClass:方法被確認(rèn)了是PlayingCard類的實例,那么如果我們給card實例發(fā)送其消息時砸狞,就不會發(fā)生崩潰捻勉。反之刀森,若card是其他類的實例踱启,如果向其發(fā)送card類的消息就會非常危險研底!

NSRange


NSRange是一個表示“范圍”的結(jié)構(gòu)體,包括起點和長度,主要用于字符串榜晦。

常用方法:

字符串所有的字符:

NSString *title = @"好好學(xué)習(xí)天天向上";
NSMakeRange(0, [title length])

判斷某個字符串里包含某個字符:

NSString *greeting = @"hellow world";
Nsstring *hi = @"hi";
NSRange r = [greeting rangeOfString:hi];
if(r.location != NSNotFound)
{
    NSLog(@"Found");
}

控制器生命周期


在控制器(ViewController)的生命周期里胚想,處于某個特定的時間點會執(zhí)行某個特定的方法芽隆。通過在這些方法里之行某些特定的任務(wù)统屈,可以正確地實現(xiàn)其應(yīng)實現(xiàn)的功能胚吁。

viewDidLoad

控制器的viewDidLoad方法在控制器的view為nil的時候被調(diào)用,在控制器的生命周期中只調(diào)用一次愁憔。


- (voidviewDidLoad
{
   [super viewDidLoad];    
   
   //可執(zhí)行:
   //1. 控制器的初始化數(shù)據(jù)
   //2. 網(wǎng)絡(luò)請求
   
   
   //不可執(zhí)行:
   //1. 視圖形狀的初始化信息
}

viewWillAppear:

控制器的viewWillAppear:在UIViewController對象的視圖即將加入窗口時調(diào)用腕扶。只要該控制器的view即將要出現(xiàn)吨掌,都會調(diào)用,在控制器的生命周期中可以調(diào)用多次膜宋。
而且,如果該方法被調(diào)用史简,就說明視圖一定會出現(xiàn)在屏幕上肛著。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    //可執(zhí)行:
    //1. 更新view離開界面后可能會改變的數(shù)據(jù)跺讯。
    //2. view的幾何變化殉农。
        
}

viewWillDisappear:

控制器的viewWillDisappear:在UIViewController的view即將不顯示的時候調(diào)用,在控制器的生命周期中可以調(diào)用多次超凳。

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    //可執(zhí)行:
    //1. 記錄滾動視圖的偏移量(因為要記住滾動位置聪建,便于下次查看)
    //2. 存儲數(shù)據(jù),便于再次顯示該控制器時使用金麸。
}

屬性字符串Demo


設(shè)計需求

  • 布局為TextView下方有四個顏色按鈕,再下方有添加輪廓按鈕和去除輪廓按鈕揍魂。
  • 選中TextView的文本后棚瘟,點擊色彩按鈕,選中的文本的顏色變成點擊的色彩按鈕的背景色偎蘸。
  • 選中TextView的文本后,點擊添加輪廓限书,選中的文本增加了輪廓章咧,再點擊色彩按鈕,輪廓變成了相應(yīng)的顏色赁严。
  • 文本有輪廓的狀態(tài)下,點擊去除輪廓按鈕卤档,輪廓消失程剥。
  • 在設(shè)置選項來改變系統(tǒng)字體,再回到本Demo界面,字體會做相應(yīng)改變茎活。

效果圖

屬性字符串效果圖

知識點詳解

屬性字符串的設(shè)置

屬性字符串分為不可變屬性字符串NSAttributedStringNSMutableAttributedString琢唾。

設(shè)置屬性字符串的一般步驟為:

  1. 初始化可變屬性字符串。
  2. 向其添加屬性字典和制定屬性字典被應(yīng)用的范圍懒熙。

舉個??:


//1. 由現(xiàn)有字符串初始化可變屬性字符串
NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:self.outLineButton.currentTitle];

//2. 添加屬性字典和范圍
[title setAttributes:@{NSStrokeWidthAttributeName : @3,
                      NSStrokeColorAttributeName  : self.outLineButton.tintColor}
                                             range: NSMakeRange(0, [title length])];

//3. 將屬性字符串賦給按鈕的屬性字符串屬性
[self.outLineButton setAttributedTitle:title forState:UIControlStateNormal];

//設(shè)定選中的字都被設(shè)置為和點擊的按鈕一樣的背景顏色
[self.textView.textStorage  addAttribute:NSForegroundColorAttributeName value:sender.backgroundColor range:self.body.selectedRange];

關(guān)于按鈕的操作

//獲取按鈕的背景色
self.button.backgroundColor

//獲取按鈕當(dāng)前的標(biāo)題
self.button.currentTitle

//設(shè)定按鈕當(dāng)前的屬性字符串標(biāo)題
[self.button setAttributedTitle:title forState:UIControlStateNormal];

屬性字典里的key:

  • NSForegroundColorAttributeName:屬性字符串字符的顏色
  • NSStrokeColorAttributeName:屬性字符串字符輪廓的顏色
  • NSStrokeWidthAttributeName:屬性字符串字符輪廓的寬度

獲取TextView被選中的范圍

self.textView.selectedRange

通知機制

為了實現(xiàn)本Demo最后一個需求工扎,我們需要監(jiān)聽系統(tǒng)字體何時被改變了衔蹲。所以需要注冊一個能收聽“系統(tǒng)改變”廣播的頻道:

注冊通知:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prefredFontsChaged:) name:UIContentSizeCategoryDidChangeNotification object:nil];

這樣一來,當(dāng)系統(tǒng)字體發(fā)生變化時舆驶,注冊該頻道的對象會收到通知并執(zhí)行自定義的方法。
當(dāng)改變系統(tǒng)字體的大小后拘荡,該類會收到通知撬陵,并調(diào)用prefredFontsChaged:方法,此時Demo上的字體也要做相應(yīng)的改變:

- (void)prefredFontsChaged: (NSNotification *)notification
{
    //收到通知后蟋定,調(diào)用本地自定義的方法
    [self userPreferredFonts];
}

- (void)userPreferredFonts
{
    //使用被改變后的系統(tǒng)字體
    self.body.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
    self.headLine.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
    
}

這里垢夹,顯然又是一個MVC的流程:系統(tǒng)字體(模型)被改變了维费,通過廣播(通知)的機制來告訴控制器,然后控制器再調(diào)用更改View的方法犀盟。還記得在第一篇(詳情請見:斯坦福大學(xué)iOS開發(fā)公開課總結(jié)(一) :iOS的MVC框架)里強調(diào)的阅畴,從模型到控制器的通信是通過廣播或KVO機制完成的么?

最后的話


如果哪位小伙伴想拿到此Demo的代碼請不要客氣,在評論里留言即可颤专。
而且十分歡迎給筆者的代碼和文筆拋出寶貴的意見和建議~

本文為筆者原創(chuàng)钠乏,如需轉(zhuǎn)載,請事先與筆者交涉~

2016.7.12日更新:


筆者已經(jīng)把目前為止整理的所有Demo(第二課到第十課)放入到了我的GitHub倉庫里簇捍。分為英文注釋版和中文注釋版(英文注釋要少一點俏拱,嘿嘿)想要的小伙伴可以果斷下載~ 如果有不知道怎么下載的小伙伴請聯(lián)系我~

本文已在版權(quán)印備案,如需轉(zhuǎn)載請訪問版權(quán)印锅必。48422928

獲取授權(quán)

-------------------------------- 2018年7月17日更新 --------------------------------

注意注意!7直汀尔许!

筆者在近期開通了個人公眾號,主要分享編程蒸甜,讀書筆記余佛,思考類的文章。

  • 編程類文章:包括筆者以前發(fā)布的精選技術(shù)文章辉巡,以及后續(xù)發(fā)布的技術(shù)文章(以原創(chuàng)為主),并且逐漸脫離 iOS 的內(nèi)容憔恳,將側(cè)重點會轉(zhuǎn)移到提高編程能力的方向上净蚤。
  • 讀書筆記類文章:分享編程類思考類程梦,心理類職場類書籍的讀書筆記屿附。
  • 思考類文章:分享筆者平時在技術(shù)上生活上的思考衣厘。

因為公眾號每天發(fā)布的消息數(shù)有限制压恒,所以到目前為止還沒有將所有過去的精選文章都發(fā)布在公眾號上,后續(xù)會逐步發(fā)布的型宙。

而且因為各大博客平臺的各種限制伦吠,后面還會在公眾號上發(fā)布一些短小精干,以小見大的干貨文章哦~

掃下方的公眾號二維碼并點擊關(guān)注毛仪,期待與您的共同成長~

公眾號:程序員維他命
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箱靴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棍矛,更是在濱河造成了極大的恐慌抛杨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茁帽,死亡現(xiàn)場離奇詭異屈嗤,居然都是意外死亡,警方通過查閱死者的電腦和手機战秋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門讨韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狰闪,你說我怎么就攤上這事濒生。” “怎么了罪治?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵觉义,是天一觀的道長。 經(jīng)常有香客問我晒骇,道長,這世上最難降的妖魔是什么徒坡? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任瘤缩,我火速辦了婚禮,結(jié)果婚禮上何暮,老公的妹妹穿的比我還像新娘铐殃。我一直安慰自己,他們只是感情好富腊,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布赘被。 她就那樣靜靜地躺著,像睡著了一般浮入。 火紅的嫁衣襯著肌膚如雪羊异。 梳的紋絲不亂的頭發(fā)上彤断,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天易迹,我揣著相機與錄音,去河邊找鬼供炼。 笑死窘疮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闸衫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼疫蔓,長吁一口氣:“原來是場噩夢啊……” “哼身冬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滚躯,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嘿歌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丧凤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體步脓,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年仍侥,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸳君。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡砸紊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情看铆,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布否淤,位于F島的核電站棠隐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啰扛。R本人自食惡果不足惜嗡贺,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煞茫。 院中可真熱鬧摄凡,春花似錦、人聲如沸亲澡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽会涎。三九已至,卻和暖如春概页,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惰匙。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哑梳,地道東北人绘盟。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像吠卷,于是被迫代替她去往敵國和親沦零。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,509評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件屯仗、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 《幸福的種子》是我接觸的第一本繪本理論方向的書籍,作者松居直被譽為日本圖畫書之父瞄沙,透過書中的文字與之對話慌核,他如同一...
    北燕楠飛閱讀 456評論 0 7
  • 也許每個人都會聽到過這樣的一種聲音,在夜深人靜的時候垫桂,樓上的一種奇特的聲音粟按。 “嗒…嗒…嗒嗒嗒……”仿佛是玻璃球敲...
    山月有蹤閱讀 863評論 0 1
  • 聊天,是最基本的生活方式灭将。通過友好的交談,可以增進(jìn)彼此的友誼空镜,獲取新鮮的知識,想要達(dá)到這個結(jié)果吴攒,就需要技巧,而不是...
    蝸牛up666閱讀 165評論 0 0