斯坦福大學(xué)iOS公開(kāi)課筆記(6)-多態(tài)與多個(gè)MVC的使用

layout: 斯坦福大學(xué)ios公開(kāi)課筆記(6)--
title: 多態(tài)與多個(gè)MVC的使用
date: 2017-05-21 22:23:08
tags:


這節(jié)課主要介紹了多態(tài)的概念和使用从祝,還有多個(gè)MVC使用持舆,在這之中介紹了UINavigationController和UITabbarController的使用。

多態(tài)

多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)中類(lèi)的三大特征之一粪狼,另外兩個(gè)是繼承和封裝含思。objective-c是一個(gè)面向?qū)ο蟮拈_(kāi)發(fā)語(yǔ)言撵儿,所以了解如何使用多態(tài)是非常有必要的。

在將多態(tài)的時(shí)候有一個(gè)概念不得不提---抽象惶桐。

抽象

抽象表示這個(gè)類(lèi)不能被實(shí)例化使用撮弧,他只能用于作為具體類(lèi)的超類(lèi)潘懊。簡(jiǎn)單來(lái)說(shuō)抽象就相當(dāng)于概念車(chē)。我們把車(chē)具體化給他四個(gè)輪子贿衍,他可能就是汽車(chē)??授舟,給他兩個(gè)輪子,他可能就是自行車(chē)??舌厨。這就是抽象岂却。

如何實(shí)現(xiàn)

這里我們對(duì)之前寫(xiě)的Machismo紙牌配對(duì)游戲進(jìn)行了修改,不了解這個(gè)游戲的請(qǐng)先看這里,使得它可以對(duì)任何種類(lèi)的卡牌進(jìn)行配對(duì)游戲裙椭。

首先躏哩,我們之前的代碼是這樣的:

- (CardMatchingGame *)game
{
    if(!_game)
    {
        _game = [[CardMatchingGame alloc] initWithCardCount:[self.cardButtons count] usingDeck:[self createDeck]];
    }
    
    return _game;
}

- (Deck *)createDeck
{
    return [[PlayingCardDeck alloc] init];    
}

這里的return [[PlayingCardDeck alloc] init];代表我們只會(huì)返回PlayingCardDeck這個(gè)牌堆中的排,如果想要把他抽象揉燃,我們首先要把這里改成return nil;扫尺。這樣他就變成了一個(gè)抽象類(lèi)。

然后我們將- (Deck *)createDeck;這個(gè)方法放置到.h公有文件中炊汤,并且寫(xiě)一些注釋來(lái)說(shuō)明他就是這個(gè)抽象類(lèi)具體化時(shí)所需要用到的方法正驻。

//用來(lái)返回不同種類(lèi)的卡牌
- (Deck *)createDeck;       //abstract

接下來(lái)我們新建一個(gè)controller繼承之前抽象好的控制器,然后重寫(xiě)createDeck方法抢腐,返回正確的卡牌姑曙,就完成了我們的多態(tài)。這樣迈倍,我們可以創(chuàng)建很多控制器返回不同的卡牌類(lèi)型伤靠,并且使用同一套邏輯進(jìn)行游戲。

#import "ViewController.h"

@interface PlayingCardViewController : ViewController

@end

#import "PlayingCardViewController.h"
#import "PlayingCardDeck.h"

@interface PlayingCardViewController ()

@end

@implementation PlayingCardViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (Deck *)createDeck
{
    return [[PlayingCardDeck alloc] init];
}

@end

對(duì)了啼染,這里要注意宴合,如果你是使用storyboard創(chuàng)建的界面,別忘了把控制器的Class改成剛剛具體化的類(lèi)迹鹅。

多個(gè)MVC協(xié)作

UINavigationController

UINavigationController導(dǎo)航欄卦洽,它本身也算作是一個(gè)MVC,他的view就是頂部的導(dǎo)航欄斜棚。他有一個(gè)rootViewController作為輸出口指向其他MVC阀蒂。

導(dǎo)航欄擁有一個(gè)自己的容器,這個(gè)容器使用的是棧結(jié)構(gòu)弟蚀,每次我們?cè)趫?zhí)行進(jìn)入下一個(gè)頁(yè)面或者返回到上一個(gè)頁(yè)面的時(shí)候都是一個(gè)椫拢空間壓入和彈出的功能的執(zhí)行。

每次我們壓入新的MVC的時(shí)候粗梭,系統(tǒng)都會(huì)從storyboard生成一個(gè)新的文件,然后顯示出來(lái)级零。而當(dāng)我們彈出的時(shí)候断医,頁(yè)面消失滞乙,這部分也會(huì)被釋放掉。這時(shí)候如果你有需要持久化使用的數(shù)據(jù)鉴嗤,你就要把他保存起來(lái)斩启。

如何壓入一個(gè)MVC

答案是使用segue。他是storyboard和Xcode之間唯一聯(lián)系的地方醉锅,我們通過(guò)segue的標(biāo)示符來(lái)判斷跳到哪一個(gè)MVC兔簇。

如何彈出一個(gè)MVC

通過(guò)方法

[self.navigationController popViewControllerWithAnimated:YES];

就可以彈出當(dāng)前的MVC

如何使用segue

我們需要讓Xcode知道當(dāng)我要調(diào)到下一個(gè)頁(yè)面的時(shí)候我選擇的是什么類(lèi)型的東西,比如我們要從日歷中的月份跳到日期的時(shí)候硬耍,我們需要知道我點(diǎn)擊的是幾號(hào)的日期垄琐。

- (void)prepareForSegue:(UIStroyboardSegue *)segue sender: (id)sender
{
  if ([segue.identifier isEqualToString:@"DoSomething"])
  { 
      if ([segue.destinationViewController isKindOfClass:[DoSomethingVC class]]){
      
       DoSomethingVC *doVC = (DoSomethingVC *)segue.desitinationViewController;
       doVC.infoString = ...
      }
      
    }
}

多個(gè)MVC協(xié)作的Demo

這里我們使用到了上節(jié)課使用的項(xiàng)目Attributor.在這次的課中我們給他添加一個(gè)新的MVC经柴,并要求這個(gè)MVC可以獲得上一個(gè)MVC的數(shù)據(jù)然后分析出有多少個(gè)字符改變了顏色或者多少個(gè)字符添加了邊框狸窘。

在storyboard中我們使用導(dǎo)航欄來(lái)控制各個(gè)MVC

storyBoardScreen.png

設(shè)置頁(yè)面?zhèn)髦?/h3>

如果想要分析上一個(gè)頁(yè)面中設(shè)置字符的顏色,就一定要拿到上一個(gè)頁(yè)面中修改過(guò)的字符串信息坯认。這里就要用到頁(yè)面?zhèn)髦档墓δ芊堋m?yè)面?zhèn)髦岛?jiǎn)單來(lái)說(shuō)就是在頭文件中添加一個(gè)公有的屬性,然后在跳轉(zhuǎn)頁(yè)面的時(shí)候講值傳給他牛哺。

@interface TextStatsViewController : UIViewController

@property (nonatomic ,strong) NSAttributedString        *textToAnalyze;

@end

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"Analyzer Text"])
    {
        if([segue.destinationViewController isKindOfClass:[TextStatsViewController class]])
        {
            TextStatsViewController *tsvc = (TextStatsViewController *)segue.destinationViewController;
            tsvc.textToAnalyze = self.body.textStorage;
        }
    }
}

處理字符串

處理字符串主要是把上個(gè)頁(yè)面穿過(guò)來(lái)的字符串通過(guò)NSRange一個(gè)一個(gè)字符的分析陋气,看看他有沒(méi)有使用顏色變化或者邊框變化。

- (NSAttributedString *)chaactersWithAttributtr:(NSString *)attributName
{
    NSMutableAttributedString *characters = [[NSMutableAttributedString alloc] init];
    
    int index = 0;
    while (index < [self.textToAnalyze length])
    {
        NSRange range;
        
        id value = [self.textToAnalyze attribute:attributName atIndex:index effectiveRange:&range];
        
        if(value)
        {
            [characters  appendAttributedString:[self.textToAnalyze attributedSubstringFromRange:range]];
            index = range.length + range.location;
        }
        else
        {
            index++;
        }
        
    }
    
    return characters;
}
- (void)updateUI
{
    self.colorfulCharachersLabel.text = [NSString stringWithFormat:@"%ld colorful characters",[[self chaactersWithAttributtr:NSForegroundColorAttributeName] length]];
    
    self.outletCharachersLabel.text = [NSString stringWithFormat:@"%ld outline characters",[[self chaactersWithAttributtr:NSStrokeWidthAttributeName] length]];
       
}

寫(xiě)好之后就可以統(tǒng)計(jì)上一個(gè)頁(yè)面的字符串啦引润。

characterAttributtr.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巩趁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子椰拒,更是在濱河造成了極大的恐慌晶渠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燃观,死亡現(xiàn)場(chǎng)離奇詭異褒脯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缆毁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)番川,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人脊框,你說(shuō)我怎么就攤上這事颁督。” “怎么了浇雹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵沉御,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我昭灵,道長(zhǎng)吠裆,這世上最難降的妖魔是什么伐谈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮试疙,結(jié)果婚禮上诵棵,老公的妹妹穿的比我還像新娘。我一直安慰自己祝旷,他們只是感情好履澳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著怀跛,像睡著了一般距贷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敌完,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天储耐,我揣著相機(jī)與錄音,去河邊找鬼滨溉。 笑死什湘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晦攒。 我是一名探鬼主播闽撤,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脯颜!你這毒婦竟也來(lái)了哟旗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤栋操,失蹤者是張志新(化名)和其女友劉穎闸餐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矾芙,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舍沙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剔宪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拂铡。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖葱绒,靈堂內(nèi)的尸體忽然破棺而出感帅,到底是詐尸還是另有隱情,我是刑警寧澤地淀,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布失球,位于F島的核電站,受9級(jí)特大地震影響帮毁,放射性物質(zhì)發(fā)生泄漏她倘。R本人自食惡果不足惜璧微,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硬梁。 院中可真熱鬧,春花似錦胞得、人聲如沸荧止。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跃巡。三九已至,卻和暖如春牧愁,著一層夾襖步出監(jiān)牢的瞬間素邪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工猪半, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔朦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓磨确,卻偏偏與公主長(zhǎng)得像沽甥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乏奥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫(xiě)initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,349評(píng)論 2 4
  • iOS 實(shí)戰(zhàn)開(kāi)發(fā)課程筆記 本貼旨在作為對(duì)極客班 《iOS 開(kāi)發(fā)實(shí)戰(zhàn)》第五期期課程視頻重新學(xué)習(xí)的筆記摆舟。目標(biāo)是建立一個(gè)...
    黃穆斌閱讀 2,989評(píng)論 12 57
  • 南京的高校很多,特別是漢口路從頭到尾邓了,從南師到南大再到東大恨诱,整條街除了吃的,就是各種各樣專(zhuān)業(yè)的書(shū)店骗炉,透露著濃濃的學(xué)...
    臨泉聽(tīng)風(fēng)閱讀 189評(píng)論 0 2
  • 大家也不陌生照宝,他就是那個(gè)赤壁之戰(zhàn)中被諸葛亮氣死的帥哥,周瑜痕鳍,他出生在一個(gè)豪門(mén)貴族中硫豆,爺爺是宮廷中的太尉,爸爸又是洛...
    有點(diǎn)意思的嗬閱讀 717評(píng)論 0 0
  • 聊著聊著 有種 怎么扭轉(zhuǎn)都扭轉(zhuǎn)不過(guò)去的 怪異感 彼此干笑幾聲 結(jié)束
    夏波閱讀 176評(píng)論 0 3