微专业GeekBand-IOS应用开发实战笔记-第二周

导读:

这一章主要整理了StoryBoard和View Controller以及Segue的一些本周重点知识。同时也囊括了一些关于Delegate,GestureRecognizer的知识。

StroyBoard:

StoryBoard本身是一个ViewController的集合,其中也包括了所有ViewController里面的View,以及View里面的UIKit(也就是UILabel,UITextField等)我们所看到的那些框,标签等等其实都是Interface Builder将下面的代码转换而成的。它本身是一个.xib的文件


Interface Builder背后的代码
重点1:Action和Outlet

为了能使代码和InterfaceBuilder里面的东西相互呼应,在Button的设定里面有一项名为Action的东西,里面则包括了一个Selector:



Control拖出一个Outlet或是Action的时候系统会在.xib中自动生成一个Selector,也会生成一个@Property,问题就是,当代码(图片右边)的@Property被删除之后,左边的Reference还会存在,这就会导致出错。所以一定要把Reference清除


ViewController:

重点1:

一定要点到左边的圆圈上才是ViewController,不然的话是View。这时候你可以在右边自定义ViewController。


Segue:

终于讲到重点的Segue了!

重点1:Segue的两种使用方法
1.直接连接于Button,可以直接被Button调用

2.连接于View本身,需要手动通过Identifier调用
//调用方法:
[self performSegueWithIdentifier:@"firstSegue" sender:self];

这两种各有利弊,我的这个案例里面用了两种方法,原因如下:

  • 第一种方法:好处是便捷,但是添加一些自定义的检测比较麻烦。
  • 第二种方法:需要手动调用,但是可以像如下实例一样添加一些自定义的检测和逻辑
//这是一个Next按钮的Action函数
 - (IBAction)nextButtonAction:(id)sender {
    //在按下这个按钮之后可以执行一些行为
    self.helpTextField.text = @"";
    //也可以执行一些检测,这里的检测就是在查看是不是所有的TextField都不为空
    if ([self.textFieldUserName.text isEqual:@""]){
        self.warningTextField.text = @"What should I call you then?";
        self.textFieldUserName.backgroundColor = [UIColor redColor];
    }else if ([self.textFieldPassword.text isEqual:@""])
    {
        self.textFieldPassword.backgroundColor = [UIColor redColor];
        self.warningTextField.text = @"Blank is too simple to be safe";
    }else if (self.textFieldRePassword.text == self.textFieldPassword.text) {
        //这里是在检测是不是两次密码输入时一致的,如果是的话才手动执行Segue
        //要注意Identifier一定要一字不差哦~
        [self performSegueWithIdentifier:@"firstSegue" sender:self];
    }
    else {
        self.textFieldRePassword.backgroundColor = [UIColor redColor];
        self.warningTextField.text = @"I said keep it the same right?";
    }
}
重点2:Unwind-Segue

为什么需要Unwind-Segue呢?难道不可以直接再用一个Button连一个新的Segue么?


两个按钮都是Show的Segue,互相连接

答案是,因为这样就会将一个接一个地加载ViewController并互相叠加,就会产生如下图一般的结构,加重程序的负担,占用更多的内存:


两个按钮来回点之后View的结构
正确的做法:Unwind-Segue
- (IBAction) unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC {}

在第一个ViewController.m文件里加上上面这一行代码之后,就可以在将按钮右键拖到Exit时看到unwindSegue的选项


Unwind Segue

如果想要Unwind多层,那么就用以下代码
- (IBAction) unwindToHome:(UIStoryboardSegue *)unwindSegue { }
这样就可以连跳多层,一直回到有以上代码的ViewController.m文件所对应的那个ViewController

重点3:Segue间的数据传送

这是一个我在制作中碰到不少问题的一个步骤,不过最终顺利解决了。
以下是我使用的代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    YourCustomViewController *vc = [segue destinationViewController];
    [vc setDataToTransfer: data];
}

这里的CustomViewController并不是当前的ViewController,而是目标的CustomViewController,也就是说要#import一个新的头文件,并且在另外的一个ViewController中自定义一个函数来接受信息。
比如说当前是ViewControllerStep1.m,那么我需要先#import “ViewControllerStep2.h",然后在ViewControllerStep2.h中创建一个 - (void) functionToRecieveData: (DataType *) data; 并在 .m 文件中实现。

其它知识:

TabRecognizer:

这个主要是用于收起键盘,我也用它来清除我的提示信息。
使用方法:

 - (void)viewDidLoad {
    [super viewDidLoad];
    
    // 添加一个行为检测器,每当屏幕被按下并松开时,执行 tabRecognized 函数
    UITapGestureRecognizer *tabRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action: @selector(tabRecognized:)];
    //在自己管理的View里面添加这个检测器
    [self.view addGestureRecognizer:tabRecognizer];
}

 - (void) tabRecognized:(UITapGestureRecognizer *)sender {
    //清除提示信息
    self.helpTextField.text = @"";
    //收起键盘
    [self.textFieldUserName resignFirstResponder];
    [self.textFieldPassword resignFirstResponder];
    [self.textFieldRePassword resignFirstResponder];
}

虽然我没有讲到,不过在官方帮助文件里有提到关于检测UIGestureRecognizerState的一段,我自己在尝试的时候一直出错,比较郁闷。以下为官方文档原文:

Although taps are discrete gestures, they are discrete for each state of the gesture recognizer; thus the associated action message is sent when the gesture begins and is sent for each intermediate state until (and including) the ending state of the gesture. Code that handles tap gestures should therefore test for the state of the gesture, for example:

 - (void)handleTap:(UITapGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        // handling code
    }
}
UITextFieldDelegate:

在测试程序的时候,有没有碰到过按下键盘的回车键但是键盘没有收起来的情况?这就代表你需要学学 UITextFieldDelegate
这个的用处有很多,不过我这里只是用来自定义键盘的Return键作用。
使用方法:

  1. 首先在.h头文件中加入UITextFieldDelegate的Protocol
@interface ViewControllerStage1 : UIViewController <UITextFieldDelegate>
  1. 在.m实现文件中,viewDidLoad函数中,将想要控制的textField的delegate设置为自己(虽然我没有测试,不过可能可以新建一个专门的delegate文件来管理delegate。
 - (void)viewDidLoad {
    [super viewDidLoad];
    //将textField的delegate设定为自己
    self.textField.delegate = self;
}
  1. 然后在.m文件里加入以下这个函数,这个函数会在按钮按下Return的时候被执行,以检测是否应该Return。这时候可以通过resignFirstResponser的方式收回键盘,或是执行一些其它的想要在Return的时候做的事情,例如改颜色什么的。最后return YES代表执行return NO代表不执行。
 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    textField.backgroundColor = [UIColor clearColor];
    return YES;
}

最后补充一下,这个函数是包含在 UITextFieldDelegate Protocol 里面的,还有以下众多的不同函数哦。

结尾:

这一周的习题对我来说本身不算太难,但是为了达到我希望的一些功能,比如说收起键盘,自定义Return键,Segue前的检测等等,虽然查找各种文档和资料很累,不过却也受益良多。所以说,最重要的还是要学会自学,如果官方文档全部都记下来,那么编程绝对妥妥的。

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

推荐阅读更多精彩内容