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

导读:

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

StroyBoard:

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


微专业GeekBand-IOS应用开发实战笔记-第二周_第1张图片
Interface Builder背后的代码
重点1:Action和Outlet

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


微专业GeekBand-IOS应用开发实战笔记-第二周_第2张图片

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


微专业GeekBand-IOS应用开发实战笔记-第二周_第3张图片

ViewController:

重点1:

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


微专业GeekBand-IOS应用开发实战笔记-第二周_第4张图片

Segue:

终于讲到重点的Segue了!

重点1:Segue的两种使用方法
微专业GeekBand-IOS应用开发实战笔记-第二周_第5张图片
1.直接连接于Button,可以直接被Button调用

微专业GeekBand-IOS应用开发实战笔记-第二周_第6张图片
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么?


微专业GeekBand-IOS应用开发实战笔记-第二周_第7张图片
两个按钮都是Show的Segue,互相连接

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


微专业GeekBand-IOS应用开发实战笔记-第二周_第8张图片
两个按钮来回点之后View的结构
正确的做法:Unwind-Segue
- (IBAction) unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC {}

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


微专业GeekBand-IOS应用开发实战笔记-第二周_第9张图片
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 
  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 里面的,还有以下众多的不同函数哦。

微专业GeekBand-IOS应用开发实战笔记-第二周_第10张图片

结尾:

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

你可能感兴趣的:(微专业GeekBand-IOS应用开发实战笔记-第二周)