斯坦福大学iOS公开课笔记(6)-多态与多个MVC的使用

layout: 斯坦福大学ios公开课笔记(6)--
title: 多态与多个MVC的使用
date: 2017-05-21 22:23:08
tags:


这节课主要介绍了多态的概念和使用,还有多个MVC使用,在这之中介绍了UINavigationController和UITabbarController的使用。

多态

多态是面向对象程序设计中类的三大特征之一,另外两个是继承和封装。objective-c是一个面向对象的开发语言,所以了解如何使用多态是非常有必要的。

在将多态的时候有一个概念不得不提---抽象。

抽象

抽象表示这个类不能被实例化使用,他只能用于作为具体类的超类。简单来说抽象就相当于概念车。我们把车具体化给他四个轮子,他可能就是汽车🚗,给他两个轮子,他可能就是自行车🚲。这就是抽象。

如何实现

这里我们对之前写的Machismo纸牌配对游戏进行了修改,不了解这个游戏的请先看这里,使得它可以对任何种类的卡牌进行配对游戏。

首先,我们之前的代码是这样的:

- (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];代表我们只会返回PlayingCardDeck这个牌堆中的排,如果想要把他抽象,我们首先要把这里改成return nil;。这样他就变成了一个抽象类。

然后我们将- (Deck *)createDeck;这个方法放置到.h公有文件中,并且写一些注释来说明他就是这个抽象类具体化时所需要用到的方法。

//用来返回不同种类的卡牌
- (Deck *)createDeck;       //abstract

接下来我们新建一个controller继承之前抽象好的控制器,然后重写createDeck方法,返回正确的卡牌,就完成了我们的多态。这样,我们可以创建很多控制器返回不同的卡牌类型,并且使用同一套逻辑进行游戏。

#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

对了,这里要注意,如果你是使用storyboard创建的界面,别忘了把控制器的Class改成刚刚具体化的类。

多个MVC协作

UINavigationController

UINavigationController导航栏,它本身也算作是一个MVC,他的view就是顶部的导航栏。他有一个rootViewController作为输出口指向其他MVC。

导航栏拥有一个自己的容器,这个容器使用的是栈结构,每次我们在执行进入下一个页面或者返回到上一个页面的时候都是一个栈空间压入和弹出的功能的执行。

每次我们压入新的MVC的时候,系统都会从storyboard生成一个新的文件,然后显示出来。而当我们弹出的时候,页面消失,这部分也会被释放掉。这时候如果你有需要持久化使用的数据,你就要把他保存起来。

如何压入一个MVC

答案是使用segue。他是storyboard和Xcode之间唯一联系的地方,我们通过segue的标示符来判断跳到哪一个MVC。

如何弹出一个MVC

通过方法

[self.navigationController popViewControllerWithAnimated:YES];

就可以弹出当前的MVC

如何使用segue

我们需要让Xcode知道当我要调到下一个页面的时候我选择的是什么类型的东西,比如我们要从日历中的月份跳到日期的时候,我们需要知道我点击的是几号的日期。

- (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 = ...
      }
      
    }
}

多个MVC协作的Demo

这里我们使用到了上节课使用的项目Attributor.在这次的课中我们给他添加一个新的MVC,并要求这个MVC可以获得上一个MVC的数据然后分析出有多少个字符改变了颜色或者多少个字符添加了边框。

在storyboard中我们使用导航栏来控制各个MVC

storyBoardScreen.png

设置页面传值

如果想要分析上一个页面中设置字符的颜色,就一定要拿到上一个页面中修改过的字符串信息。这里就要用到页面传值的功能。页面传值简单来说就是在头文件中添加一个公有的属性,然后在跳转页面的时候讲值传给他。

@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;
        }
    }
}

处理字符串

处理字符串主要是把上个页面穿过来的字符串通过NSRange一个一个字符的分析,看看他有没有使用颜色变化或者边框变化。

- (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]];
       
}

写好之后就可以统计上一个页面的字符串啦。

characterAttributtr.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,321评论 2 4
  • iOS 实战开发课程笔记 本贴旨在作为对极客班 《iOS 开发实战》第五期期课程视频重新学习的笔记。目标是建立一个...
    黄穆斌阅读 2,975评论 12 57
  • 南京的高校很多,特别是汉口路从头到尾,从南师到南大再到东大,整条街除了吃的,就是各种各样专业的书店,透露着浓浓的学...
    临泉听风阅读 184评论 0 2
  • 大家也不陌生,他就是那个赤壁之战中被诸葛亮气死的帅哥,周瑜,他出生在一个豪门贵族中,爷爷是宫廷中的太尉,爸爸又是洛...
    有点意思的嗬阅读 704评论 0 0
  • 聊着聊着 有种 怎么扭转都扭转不过去的 怪异感 彼此干笑几声 结束
    夏波阅读 175评论 0 3