iOS中几种设计模式(一)———— 代理模式

代理:说的通俗一点就是自己做不了的事情,交给代理来做。

在这里通过一个例子来说明代理的使用。

1.实现一个例子,说明将要实现的功能:在一个视图控制器上定义一个lable1,一个button1(为了和下一个视图控制器上的控件进行区分,这里我们加个后缀1);通过点击button1,切换到视图控制器2。控制器2上,有一个button2和一个textField。用代理实现的功能是:当点击控制器2上的button2时,回到控制器1上,并将lable上的text内容改为我们在控制器2上textField上输入的内容。

                              

                  

2.首先我们创建一个视图控制器1(背景为红色的视图),并在上面添加上了一个button和一个lable。通过模态视图切换到另一个视图控制器2(背景为紫色的视图)上面。注:模态视图:就是在一个视图的基础上弹出另外一个视图,这个一个新的视图结构。并且当这个模态视图没有销毁并一直存在的时候,我们不能够进行对原来视图进行操作。当视图1切换到视图2时:我们的实现,

<span style="font-size:18px;">- (void)onButtonClicked:(UIButton *)sender
{
    SFSecendViewController *secondVC = [[SFSecendViewController alloc] init];
   </span>
<span style="font-size:18px;"> [self presentViewController:secondVC animated:YES completion:NULL];
}
</span>
这段代码的含义就是当点击视图1中的button时的回调事件。在这里我们首先建立一个视图2的对象,并利用模态视图将视图2弹出:
<span style="font-size:18px;"> [self presentViewController:secondVC animated:YES completion:NULL];
</span>

每一个弹出的模态视图,我们都应该释放掉,否则就无法对原来的视图进行任何操作。对应的释放代码:

[selfdismissViewControllerAnimated:YEScompletion:NULL];


我们要做的就是当点击视图2的button时,返回视图1,视图2上textField中的内容传递给视图1上的lable,并显示出来。基于模态视图的特点,也就是当该模态视图没有消失的时候,我们不能够操作原来的视图;而我们在视图2上也没有办法操作视图1上的数据。所以我们就将视图控制器2的代理设置成为视图控制器1。
首先我们先创建一个协议,并声明一个方法。然后为该协议添加一个对象,该对象的名称为delegate。
<span style="font-size:18px;">@protocol SFChangeLableDelegate <NSObject>

</span>
<span style="font-size:18px;">- (void)changeLable:(NSString *)text;

</span>
<span style="font-size:18px;">@end</span>

<span style="font-size:18px;">@interface SFSecendViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic,weak) id <SFChangeLableDelegate> delegate;

@end
</span>
然后在点击button取消当前模态视图,返回原来的视图的时候调用协议中定义的方法,并将参数传递给代理对象。
<span style="font-size:18px;">- (IBAction)onButtonClicked:(UIButton *)sender
{
    [self dismissViewControllerAnimated:YES completion:NULL];
    //在这里将textField的text值赋值给text。
    NSString *text = self.textField.text;
    //用本视图控制器的代理 调用代理中的回调。并将textField的text值传递给该回调。
    [self.delegate changeLable:text];
}</span>

而在视图1中要遵守视图2定义的协议才能实现代理的作用。
<span style="font-size:18px;">@interface SFViewController : UIViewController <SFChangeLableDelegate>

@end
</span>
 
遵守了协议之后,那么就可以实现代理中的回调方法了,同时也就可以进行数据的改变了。

<span style="font-size:18px;">- (void)changeLable:(UITextField *)textfield
{
    self.lable.text = textfield.text;
}
</span>


用代理的时候需要注意的是,代理类首先要遵守协议;另一方面是不要忘记设置代理为当前的视图控制器。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值