之前在StackOverFlow上看到一篇讲传值(segue传值和delegate传值)的文章,感觉讲的非常清晰,就将delegate部分翻译了一下。有兴趣能够看看。

原文:

http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers

译文:

为了从ViewControllerB往回传值到ViewControllerA,我们须要使用协议(Protocols)和代理(Delegates)。

为了实现这个过程,我们须要设置ViewControllerA为ViewControllerB的代理。

这样可以使ViewControllerB可以发送消息到ViewControllerA,相同也能使我们将数据回传。

ViewControllerA作为ViewControllerB的代理必需要遵从我们在ViewControllerB中定义的协议(Protocols),这可以告诉ViewControllerA有哪些方法是必需要实现的。

1.在ViewControllerB.h中,在#import和@interface之间(就是代码位置)。我们像以下这样定义我们的协议及协议方法:

@classViewControllerB;//
Important

@protocol ViewControllerBDelegate <NSObject>

- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;

@end

注:(NSString *)item是我们如今要回传的数据类型,也能够是其它类型,如字典、数组等

2.仍然是在ViewControllerB.h中。设置一个delegate属性,同一时候在ViewController.m中synthesize

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

在project中我是这么做的:

@propertyid<SelectPeopleVCDelegate>delegate;

3.在ViewControllerB中,我们在将要从导航控制器中弹出该视图的时候向代理发送消息(消息中含有我们要传递的值)

NSString *itemToPassBack = @"Pass this value back to ViewControllerA";

[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];

在实际project中我是这样完毕的:

- (void)viewDidDisappear:(BOOL)animated

{

[self.delegateaddItemViewController:selfdidFinishSelectPeople:dataSourceArray];

}

注:dataSourceArray是我的数据源,在一个公开变量,在前面的程序中完毕赋值。

4.以上就是全部要在ViewControllerB中进行的操作。接下来就是ViewControllerA的操作。

首先我们要在ViewControllerA.h中导入ViewControllerB,并遵从它的协议:

#import "ViewControllerB.h"

@interface ViewControllerA :UIViewController <ViewControllerBDelegate>

5.在ViewControllerA.m中实现协议方法:

- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString
*)item

{

    NSLog(@"This was returned from ViewControllerB %@",item);

}

6.最后,在我们将ViewControllerB压入堆栈之前,我们须要告诉ViewControllerB,ViewControllerA是它的代理(delegate)

ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB"
bundle:nil];

viewControllerB.delegate = self

[[self navigationController] pushViewController:viewControllerB animated:YES];

在实际project中我是这样做的:

- (void)prepareForSegue:(UIStoryboardSegue
*)segue sender:(id)sender

{

UIViewController * viewController = segue.destinationViewController;

BAGSelectPeopleVC * selectPeopleVC = (BAGSelectPeopleVC
*)viewController;

selectPeopleVC.delegate =self;

}

iOS视图控制器之间delegate传值教程的更多相关文章

  1. iOS 视图控制器转场详解

    iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...

  2. storyboard三种sugue 和 跳转场景的三种方式 以及控制器之间的传值

    Storyboard引入了2个概念:1. scene:一个场景,由一个viewController和相关的xib表示. 2. segue:在这是用于连接scenes,其有多种类型,iphone包括:P ...

  3. iOS视图控制器的生命周期

    今天面试有一道面试题因为回答不好,因为也不经常涉及所以有点模糊,我选择了最保守的回答,没有展开写出我对这个问题的理解. 问题:IOS 开发 loadView 和 viewDidLoad 的区别? 经过 ...

  4. iOS开发控制器之间传值的几种小方法

    在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...

  5. iOS:使用block进行类与类,控制器与控制器之间的传值

    介绍:在iOS中类与类,控制器与控制器之间传值的方式有多种,分别是:单例传值.代理传值.通知传值.block传值或者一些偏好设置也可以用来传值.... 每一种传值方式都有各自的优点和缺点,针对不同情况 ...

  6. 笔记-iOS 视图控制器转场详解(上)

    这是一篇长文,详细讲解了视图控制器转场的方方面面,配有详细的示意图和代码,为了使得文章在微信公众号中易于阅读,seedante 辛苦将大量长篇代码用截图的方式呈现,另外作者也在 Github 上附上了 ...

  7. iOS 不同类之间的传值

    iOS是面向对象开发的,有很多不同的类,很多时候会遇到类与类之间的"交流"需求,比如通知.传递数值等等,(通知可以用nsnotificationcenter来做, 以后总结)下面主 ...

  8. 学习笔记:iOS 视图控制器(UIViewController)剖析

    转自:http://www.cnblogs.com/martin1009/archive/2012/06/01/2531136.html 视图控制器在iOS编程中占据非常重要的位置,因此我们一定要掌握 ...

  9. iOS 视图控制器转场动画/页面切换效果/跳转动画 学习

    一 学习 在 UINavigationController 中 push 和 pop 的转场效果  (基于iOS7 以上的转场方式) 经过学习了解到,重点分三块: (1)pushAnimation:  ...

随机推荐

  1. docker学习笔记5:利用commit命令创建镜像 和 删除本地镜像

    一.概述 创建镜像有两种方法,一是用commit命令,二是用dockerfile方法(这个更常用,在下面文章介绍).本章介绍commit方法. 在介绍commit命令前,我们先回顾下对代码的版本控制, ...

  2. Windows Azure 社区新闻综述(#78 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话.以下是本周的亮点. 博客文章: 博客:Windows Azure BizTalk 服务:如何开 ...

  3. 基于visual Studio2013解决C语言竞赛题之0904文件排序

       题目

  4. 清华集训2014 day1 task1 玛里苟斯

    题目 这可算是描述很简单的一道题了!但是不简单. \(S\)是一个可重集合,\(S = \{a_1, a_2, \dots, a_n \}\). 等概率随机取\(S\)的一个子集\(A = \{a_{ ...

  5. 一步一步重写 CodeIgniter 框架 (4) —— load_class 管理多个对象实例的思路

    我们使用CodeIgniter 框架最主要是想利用其 MVC 特性,将模型.视图分开,并通过控制器进行统一控制.在尝试实现 MVC 模式之前,我们将实现其中一个对程序结构非常有用的技巧,就是 load ...

  6. JDK 安装环境配置(ubuntu)

    在Ubuntu 上安装jdk,先去官网下载相对应的tar包 网址:(这是jdk1.8) http://www.oracle.com/technetwork/java/javase/downloads/ ...

  7. Core 中文文档

    ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序   原文:Your First ASP. ...

  8. TTimerThread和TThreadedTimer(都是通过WaitForSingleObject和CreateEvent来实现的)

    //////////////////////////////////////////////////// // // // ThreadedTimer 1.24 // // // // Copyrig ...

  9. poj 百练 2765 八进制小数(精度问题)

    2765:八进制小数 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描写叙述 八进制小数能够用十进制小数精确的表示.比方,八进制里面的0.75等于十进制里 ...

  10. ASP.NET、WinForm、C# - 配置文件信息读取 [ Web.config || Appconfig ]

    <configuration> <appSettings> <add key="name" value="HF_Ultrastrong&qu ...