您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>通讯/手机编程>

iOS开发关于Delegate的案例分析

大小:0.3 MB 人气: 2017-09-26 需要积分:1

  有两个scene,分别为Scene A和Scene B。Scene A上有一个UIButton(Button A)和一个UILable(Lable A);Scene B上有一个UITextFiled(textFiled)。当单击Scene A上的Button A时,跳转到Scene B,在Scene B的textFiled上输入文字,单击键盘的“完成”按钮,返回到Scene A,并在Scene A的Lable A上显示刚才输入的内容。

  这是一个典型的场景之间的跳转和逆向传值问题,看似简单,却暗藏杀机。我们不仅要使用Storyboard框架,还要采用Delegate模式,最后达到题目要求。

  Delegate

  什么是Delegate?跟这道题目又有什么关系呢?

  简单分析一下题目,主要包括Storyboard的应用,页面跳转,数据的交互,似乎跟Delegate没什么关系呢。在这里我决定先不刨根问底,留一个小悬念,在实际的解决问题的过程中去慢慢“悟”关于Delegate的一切,它是一种设计模式,并不是那么简单就能描述清楚的。

  页面之间的数据传递

  iOS提供了多种方法,来实现页面之间的数据传递:

  使用SharedApplication,定义一个类似全局的变量来传递

  使用文件,或者使用NSUserdefault来传递

  通过一个单例(SingleXX)的class来传递

  通过Delegate来传递

  关于数据的存储方式共有五种:

  User Defaults

  Property List(对应)

  Object archives

  SQLite

  Core Data

  在本道题目当中,显然采用Delegate方式是最佳方案。

  界面搭建

  有了先前我们使用Storyboard的经验,我们先很快的对界面进行搭建。先抛开所有的segue不管,先把题目中描述的情况展现出来再说。

  我们新建名为delegateSentValue的工程,在原有viewController的基础上再新建一个,同时新建名为viewController2的.h和.m文件,对它们进行关联。再向两个view中拖放组件,并且将它们关联到相应的文件。这个过程应该是很简单的,我们暂且不管需要响应事件的Button,只是将两个Lable和一个textFiled在两个.h文件中进行属性声明。完成后如下图:

  iOS开发关于Delegate的案例分析












 

  iOS开发关于Delegate的案例分析

  搭建完成界面之后,我们先实现从Scene A到Scene B的跳转。通过“Ctrl+drag”操作,将Button与Scene B关联,设置为“modal”模式,然后我们选中这个Segue,将它的identifier命名为Segue_ID_AB。

  iOS开发关于Delegate的案例分析

  我们可以先来运行下,这时我们可以实现通过点击按钮实现页面正向跳转的功能,点击输入框,我们可以接受键盘的输入。

  Delegate应用

  我们所剩的任务还有输入内容,单击键盘上的“完成(return)”按钮,返回Scene A,并将刚才输入的内容显示在Scene A中。

  对于一个Delegate应用,需要5步来完成:

  委托者声明一个Delegate

  委托者调用Delegate内的方法

  关联委托者与被委托者

  被委托者遵循Delegate协议

  被委托者重写Delegate内的方法

  委托者声明一个Delegate

  在ViewController2中,#import下,@interface前添加如下代码:

  @protocol ViewController2Delegate -(void) viewController2:(ViewController2 * )sceneBVC didInputed:(NSString * )string;

  @end

  在@interface中声明:

  @property (weak, nonatomic) id delegate;

  通过@protocol创建一个Delegate并声明。

  这里需要注意的一点是,如果仅仅是按照上面的要求去添加代码,会出现“Expected a type.”的错误,原因是我们要使用ViewController2类型,而这个类型先前是没有定义过的,可是如果我们把@protocol,也就是上面三行代码移到@property下面去的时候呢,在声明中的ViewController2Delegate又出现了同样的问题。于是乎,我们需要修改一下代码的结构,我们首先创建Delegate,然后声明,最后再在@interface的后面定义Delegate内的方法,这样一来就没有问题了。最后完整的ViewController2.h的代码如下:

  #import @protocol ViewController2Delegate;

  @interface ViewController2 : UIViewController

  @property (weak, nonatomic) IBOutlet UILabel *showInformation2;

  @property (weak, nonatomic) IBOutlet UITextField *inputInformation;

  @property (weak, nonatomic) id delegate;

  @end

  @protocol ViewController2Delegate -(void) viewController:(ViewController2 *) sceneBVC didInputed:(NSString *) string;

  @end

  委托者调用Delegate内的方法

  解决了上面的问题后,这一步就比较简单了,添加代码即可:

  -(BOOL)textFieldShouldReturn:(UITextField *) textField{

  if (self.delegate) {

  //将UITextField内容传递给Delegate内的方法

  [self.delegate viewController:self didInputed:self.inputInformation.text];

  //让当前呈现的Scene B页面消失

  [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

  }

  //让键盘消失

  [textField resignFirstResponder];

  return YES;

  }

  仅仅添加代码是远远不够的,我们还要关联,具体做法是在Storyboard中,选中ViewController2中的TextFiled控件,采用“Ctrl+drag”操作将其与ViewController2关联。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!