iOS 初学笔记之常见的几种界面传值方式

来源:互联网 发布:大数据 服务型政府 编辑:程序博客网 时间:2024/06/05 16:26

我们在iOS开发中,常见的几种界面传值方式有 1.协议代理   2.消息通知    3.KVC    4.Block  

现假如界面A 跳到界面B , 然后B在跳回A ,  A中的值传到B的方法比较简单,你只需要在B中声明一个成员属性来存放A要传给B的值即可,在A中创建B的对象,为B的成员属性直接赋值即可。如下代码:

<span style="white-space:pre"></span>ChXRegisterViewController * registerVC = [[ChXRegisterViewController alloc]init];registerVC.delegate = self;registerVC.navigationItem.title = @"界面B";       <span style="white-space:pre"></span>        [self presentViewController:registerVC animated:YES completion:nil];
当界面A跳转到界面B时, B的导航条标题的值就为 “界面B” ,  这里是可以传递任意类型的数据的,比如你在B中定义一个成员属性为数组的变量  

  NSArray * arr;

上面就可以对arr数组进行赋值  

<span style="white-space:pre"></span>registerVC<span style="font-family: Menlo; background-color: rgb(255, 255, 255);">.arr = @[@"one",@"two",@"three"];</span>

同理,字典等其他类型的数据也同样传递。

下面详细说一下从界面B传值到界面A

  1. 协议代理      使用协议和代理来传值,需要的步骤有:  主动方:制定协议,设置代理,判断代理所属的类的.m文件是否实现了协议中的方法 如果实现的话 就调用该方法 ; 被动方:遵守协议,创建主动方对象,设置当前视图为主动方的代理,实现协议中的方法 。  界面B要传值到界面A,那么B就是主动方,A就是被动方。 下面的部分代码: 

          主动方:ChXRegisterViewController

@protocol showInfo <NSObject>

//主动方制定协议,设置代理
-(void)showName:(NSString *)name andPassWord:(NSString *)password;
@end
@interface ChXRegisterViewController : UIViewController<UITextFieldDelegate>
@property (nonatomic,retain) id<showInfo> delegate;
</pre><pre name="code" class="objc">      判断代理所属的类的.m文件是否实现了协议中的方法 如果实现的话 就调用该方法        if ([self.delegate respondsToSelector:@selector(showName:andPassWord:)])        {            [self.delegate showName:field1.text andPassWord:field2.text];            [self dismissViewControllerAnimated:YES completion:nil];                }
     被动方:<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;">ChXLoginViewController</span>
<span style="font-family:Menlo;color:#008400;"><span style="font-size: 14px;"><span style="white-space:pre"></span>遵守协议:</span></span>
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">#import "ChXRegisterViewController.h"
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">@interface ChXLoginViewController : UIViewController<UITextFieldDelegate,showInfo>
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">@end
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc"><span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span>
   被动方创建主动方对象 设置当前视图为主动方的代理        ChXRegisterViewController * registerVC = [[ChXRegisterViewController alloc]init];        registerVC.delegate = self;        [self presentViewController:registerVC animated:YES completion:nil];        [registerVC release];
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span>

实现协议中的方法
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">-(void)showName:(NSString *)name andPassWord:(NSString *)password
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">{
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">    UITextField * field1 = (UITextField *)[self.view viewWithTag:100];
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">    UITextField * field2 = (UITextField *)[self.view viewWithTag:101];
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">    field1.text = name;
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">    field2.text = password;
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><pre name="code" class="objc">}
<span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"><span style="white-space:pre"></span>这样就可以把 </span><span style="color: rgb(209, 47, 27); font-family: Menlo; font-size: 14px;">ChXRegisterViewController中两个textfield的值传递到 </span><span style="font-family: Menlo; color: rgb(0, 132, 0); font-size: 14px;">ChXLoginViewController的两个textfield中</span><span style="color: rgb(0, 132, 0); font-family: Menlo; font-size: 14px;"></span><p style="margin-top: 0px; margin-bottom: 0px; font-size: 14px; font-family: Menlo; color: rgb(209, 47, 27);"></p>

  2.   KVC      KVC简介:KVC key value code的缩写键值编码的简称

    //对成员变量的值的赋值和获取操作

    //KVC对成员变量的赋值是动态进行的

    //对成员变量进行赋值如果成员变量的gettersetter方法没有声明和实现部分那么就去当前类中查找是否具有该变量名称的成员变量名 如果没有该名称命名的成员变量继续查 是否具有以下划线开头以变量名称连接的成员变量 如果存在为其赋值

    //KVC对成员变量进行赋值使用setValue:forKey:

    //value就是对成员变量赋的值  key就是成员变量的名称

    [customsetValue:@"xiaohuang"forKey:@"name"];

    //如果没有找到以name命名的成员变量(或者以下划线开头name命名的变量或者那namesetter方法)程序就会崩溃

    [customsetValue:[NSNumbernumberWithInt:19]forKey:@"age"];

    //KVC对成员变量值的获取使用的方法是valueForkey:


假如; SecondViewController向FirstViewController传值

secondeViewcontroller: 

<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;">@property (nonatomic,retain) NSString * secondColor;</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;">//KVC替代代理</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;">@property (nonatomic,retain) id delegate;</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;"></span><p style="margin-top: 0px; margin-bottom: 0px; font-family: Menlo; color: rgb(187, 44, 162);"></p></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;"> //为上一个视图控制器的成员变量进行赋值 上一个视图控制器也就是delegate变量接收的值</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;">    [self.delegate setValue:@"orange" forKey:@"firstColor"];</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;">    [self.navigationController popViewControllerAnimated:YES];</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;"></span><pre name="code" class="objc">
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;"><span style="font-variant-ligatures: no-common-ligatures; color: #000000"> </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2">if</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000">([</span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2">self</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000">.</span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187">secondColor</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000"> </span>isEqualToString<span style="font-variant-ligatures: no-common-ligatures; color: #000000">:</span>@"red"<span style="font-variant-ligatures: no-common-ligatures; color: #000000">])</span></span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;">    {</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;"><span style="font-variant-ligatures: no-common-ligatures; color: #000000">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #bb2ca2">self</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000">.</span>view<span style="font-variant-ligatures: no-common-ligatures; color: #000000">.</span>backgroundColor<span style="font-variant-ligatures: no-common-ligatures; color: #000000"> = [</span>UIColor<span style="font-variant-ligatures: no-common-ligatures; color: #000000"> </span><span style="font-variant-ligatures: no-common-ligatures; color: #3d1d81">redColor</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000">];</span></span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-size:14px;color:#d12f1b;">    }</span></blockquote>


FirstViewController:

<span style="font-size:14px;"> @property (nonatomic,retain)NSString * firstColor; //接收下一个视图控制器传递过来的字符串XLSecondViewController * second = [[XLSecondViewController alloc]init];//使用kvc对second的成员变量进行赋值[second setValue:@"red" forKey:@"secondColor"];[second setValue:self forKey:@"delegate"];[self.navigationController pushViewController:second animated:YES];//当前视图的背景颜色重新赋值-(void)viewWillAppear:(BOOL)animated{if([self.firstColor isEqualToString:@"orange"]){self.view.backgroundColor = [UIColor orangeColor];}}</span>

3.消息  简介:

 //KVO只观察成员变量的值的变化

 //消息中心观察的是消息中心发送的消息

 //消息中心整个工程中有且只有一个但是一个消息中心能够发送多条消息 区分不同的消息只能靠消息的名称一个工程中的多个消息的名称不能重复

  //一个消息可以有多个接收者(观察者)


  假设 ThirdViewController传值给 FirstViewController


  ThirdViewController:

<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;"><span style="font-size:14px;">/</span><span style="font-size:12px;">消息中心发送消息 在整个工程的任意一个函数位置都能接收到该消息</span></span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //以广播的形式发送消息</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //1、创建消息中心对象 使用单例方法创建的</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //2、消息的名称是消息的唯一标识 所有消息的名字一定不能重复</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //3、object消息携带的内容 内容可以是任意类型的对象指针 也可以是nil</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //4、接收消息的类或者叫做观察者 接收的消息名称一定和发送消息的名称完全相同 否则就接收不到消息</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    [[NSNotificationCenter defaultCenter] postNotificationName:@"changeColor" object:[UIColor magentaColor]];</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    [self.navigationController popViewControllerAnimated:YES];</span></blockquote>

<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">//接收到消息以后触发的方法 必须带有参数 因为可以通过参数获取消息的内容</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">-(void)receiveNotification:(NSNotification *)notification</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">{</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //该方法的形参是NSNotification *类型</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //notification.object获取消息的内容</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    UIColor * color = notification.object;</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    self.view.backgroundColor = color;</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">    //使用消息中心传值 替代代理</span></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><span style="font-family:Heiti SC Light;font-size:12px;">}</span></blockquote>

4.Block  同上一篇文章




0 0