界面传值1:代理传值

界面传值最简单的方法是使用属性,但是在很多时候属性无法实现此功能,比如在导航视图控制器里面从后往前传值的时候,这个时候我们就需要使用,其他方法,例如代理,block,或者是通知.这里我们详细介绍代理的使用方法.

首先我们打开xcode,添加两个viewcontroller,使用导航视图控制器来管理,第一页添加一个UILabel,用来显示内容,第二页添加一个UITextfield,用来输入内容,效果如下

屏幕快照 2016-02-03 下午9.26.12.png
178653F4-6099-43DF-8B1F-6A82E721033E.png

现在我们要实现的效果是在第二页的的textfield内容输入内容,然后在第一页的label里面显示.
首先我们要为第二页的viewcontroller声明一个协议,添加一个代理属性

代码如下

//代理遵守的协议方法
@protocol secondVCDelegate <NSObject>
-(void)passValue:(NSString *)string;
@end

@interface SecondViewController : UIViewController
@property (nonatomic,weak)id<secondVCDelegate>deleagte;//设置代理属性
@end

然后我们在推出第二个页面的时候要为第二个页面指定一个代理对象为self代码如下

-(void)next:(UIBarButtonItem *)sender{
    
    SecondViewController *secondVC = [SecondViewController new];
    secondVC.deleagte = self;
    [self.navigationController pushViewController:secondVC animated:YES];
}

不要忘记要先声明代理方法

@interface ViewController ()<secondVCDelegate>

@end

然后去第一个页面实现代理方法,也就是把把代理传过来的之显示在label上面

-(void)passValue:(NSString *)string{
    self.label.text = string;
}

在所有的贮备工作做好之后,我们就需要获取这个值,这里需要注意一点,就是在什么时候获取这个值.我们需要在第二个页面消失的时候的时候去获取这个值,并且用代理方法传过去.

-(void)back:(UIBarButtonItem *)sender{
    NSString *string = _textfield.text;
    [self.deleagte passValue:string];
    [self.navigationController popToRootViewControllerAnimated:YES];

}

这样我们就实现用代理传值.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,835评论 25 709
  • 2017年暑假7.1至8.15我通过西交利物浦大学的AIESEC组织参加了埃及当地AIESEC隶属ASU的Gree...
    琪_4df6阅读 566评论 1 0
  • 本期介绍一位德国时尚摄影师,André Josselin ,目前居住在 Hamburg。他是一位时尚摄影师,作品被...
    三点PHOTO阅读 1,568评论 3 49
  • 宛若细碎脱落的日光 亦如斑驳凋零的思念 一片一片,决绝的轻舞 三朵两朵,优雅的低诉 彷徨隐没于奔路,大地苍凉 降临...
    乔墨与鹿阅读 337评论 2 3