iOS中正向、逆向传值的方法总结

前言

本文主要介绍了关于iOS正向、逆的相关内容,对各位iOS开发者们具有一定的参考学习价值,下面话不多说了,来一起看看详细的介绍吧

iOS 开发中经常需要在页面间传递数据,也就是 值传递。常见的有的是 正向传递 也有 逆向传递。

那么如何进行值传递呢 ?!

一、正向传递(One ---> Two)

正向传值只需要在第一个视图控制器中“拿到”第二个视图控制器,然后在跳转之前将第一个视图控制器的值赋值给第二个视图控制器所需要获得这个值的属性。

需求

假设现在有 控制器One 和 控制器Two,在 One 、Two 控制器中都有个 UITextField ,在控制器 One 的 UITextField 中输入你想传递的值,然后跳转到 Two 控制器,将 One 中的 UITextField 的文本显示在 Two 的 UITextField 上。

One 传到 Two

One 控制器 (给要跳转的控制器属性赋值)

#import "OneViewController.h"
#import "TwoViewController.h"

@interface OneViewController ()

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

@end

@implementation OneViewController

- (void)viewDidLoad {
 [super viewDidLoad];

 self.navigationItem.title = @"OneVC";
}

- (IBAction)pushToTwoVC:(id)sender
{
 TwoViewController *twoVC = [[TwoViewController alloc] init];
 // 重点!给 TwoViewController 的 value 属性赋值
 twoVC.value = _oneTextF.text;
 [self.navigationController pushViewController:twoVC animated:YES];
}

@end

Two 控制器

一、先声明一个要接受值的属性

#import <UIKit/UIKit.h>

@interface TwoViewController : UIViewController

/** A 控制器传过来的值 */
@property (strong, nonatomic) NSString *value;

@end

二、在 Two 控制器中赋值

#import "TwoViewController.h"

@interface TwoViewController ()

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

@end

@implementation TwoViewController

- (void)viewDidLoad {
 [super viewDidLoad];

 self.navigationItem.title = @"TwoVC";
 // 重点!给 twoTextF 赋值
 _twoTextF.text = _value;
}

@end

一、逆向传递(Two---> One)

那么反过来从 Two 控制器如何向 One 控制器传值呢?

常用的有 代理、通知、单例、block 。

Two 传到 One

方式一、代理

1、需要在控制器 Two 制定一套协议。

2、在控制器 Two 声明一个遵守协议的代理对象。

3、在 Two 中 **恰当** 的地方 **使用代理对象调用代理方法**。

4、在 One 中遵守协议、设置代理对象、实现代理方法。

第1、2步

#import <UIKit/UIKit.h>
@class TwoViewController;

// 制订协议
@protocol TwoViewControllerDelegate<NSObject>
@optional

- (void)twoViewController:(TwoViewController *)twoVC sendValue:(NSString *)strValue;

@end

@interface TwoViewController : UIViewController

/** 代理对象(任意遵守 TwoViewControllerDelegate 的对象) */
@property (weak, nonatomic) id<TwoViewControllerDelegate> delegate;

@end

第3步

#import "TwoViewController.h"

@interface TwoViewController ()

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

@end

@implementation TwoViewController

- (void)viewDidLoad {
 [super viewDidLoad];

 self.navigationItem.title = @"TwoVC";
 // 自定义返回按钮(为了监听返回事件)
 UIButton *backBtn = [[UIButton alloc] init];
 backBtn.frame = CGRectMake(0, 0, 50, 50);
 [backBtn setTitle:@"返回" forState:UIControlStateNormal];
 [backBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
 [backBtn addTarget:self action:@selector(navBack:) forControlEvents:UIControlEventTouchUpInside];
 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backBtn];
}

- (void)navBack:(UIButton *)backBtn
{
 /** 使用代理对象调用代理方法
  1、判断代理对象是否实现代理方法
  2、使用代理对象调用代理方法(传值)
 */
 if ([self.delegate respondsToSelector:@selector(twoViewController:sendValue:)]) {
 [self.delegate twoViewController:self sendValue:@"I'm from twoVC"];
 }

 [self.navigationController popViewControllerAnimated:YES];
}

@end

第4步

#import "OneViewController.h"
#import "TwoViewController.h"

// 1、遵守协议<TwoViewControllerDelegate>
@interface OneViewController ()<TwoViewControllerDelegate>

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

@end

@implementation OneViewController

- (void)viewDidLoad {
 [super viewDidLoad];

 self.navigationItem.title = @"OneVC";
}

- (IBAction)pushToTwoVC:(id)sender
{
 TwoViewController *twoVC = [[TwoViewController alloc] init];
 // 2、设置代理对象
 twoVC.delegate = self;
 [self.navigationController pushViewController:twoVC animated:YES];
}

// 3、实现代理方法
- (void)twoViewController:(TwoViewController *)twoVC sendValue:(NSString *)strValue
{
 // 4、赋值
 self.oneTextF.text = strValue;
}

@end

方式二、通知

1、在控制器 Two 发送通知。

2、在控制器 One 添加观察者(接收通知)。

3、在控制器 One 的 dealloc 方法中移除观察者。

第1步(Two控制器中)

- (void)navBack:(UIButton *)backBtn
{
 /** 发送通知 */
 [[NSNotificationCenter defaultCenter] postNotificationName:@"sendValue" object:nil userInfo:@{@"value": @"I'm from twoVC"}];

 [self.navigationController popViewControllerAnimated:YES];
}

第2步(One控制器中)

- (void)viewDidLoad {
 [super viewDidLoad];

 self.navigationItem.title = @"OneVC";
 // 1、添加观察者对象 self
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getTwoVCValue:) name:@"sendValue" object:nil];
}

// 接收到通知时执行的方法
- (void)getTwoVCValue:(NSNotification *)noti
{
 self.oneTextF.text = noti.userInfo[@"value"];
}

第3步(One控制器中)

// 移除观察者
- (void)dealloc
{
 [[NSNotificationCenter defaultCenter] removeObserver:self];
}

方式三、单例

1、定义一个单例并声明一个属性(传递值用)。

2、在控制器 Two 给单例属性赋值 。

3、在控制器 One 中利用单例的属性取出值。

第1步

TestSingleton.h

#import <Foundation/Foundation.h>

@interface TestSingleton : NSObject

/** 构造方法,返回单例对象 */
+ (instancetype)shareInstance;
/** 用于传递值 */
@property (strong, nonatomic) NSString *values;

@end

TestSingleton.m

#import "TestSingleton.h"

@implementation TestSingleton

static TestSingleton *_instance = nil;

+ (instancetype)shareInstance
{
 static dispatch_once_t onceToken ;
 dispatch_once(&onceToken, ^{
  _instance = [[self alloc] init] ;
 }) ;

 return _instance ;
}

@end

第2步

- (void)navBack:(UIButton *)backBtn
{
 /** 生成单例并赋值 */
 TestSingleton *singleton = [TestSingleton shareInstance];
 singleton.values = @"I'm from twoVC";

 [self.navigationController popViewControllerAnimated:YES];
}

第3步

- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 /** 生成单例并取出值 */
 TestSingleton *singleton = [TestSingleton shareInstance];
 _oneTextF.text = singleton.values;
}

方式四、block

1、在控制器 Two 中定义一个 block 属性。

2、在控制器 Two 中传值。

3、在控制器 One 中接收值。

第1步:在控制器 Two 中定义一个 block 属性。

#import <UIKit/UIKit.h>

@interface TwoViewController : UIViewController

/** 定义一个 block */
@property (copy) void (^block)(NSString *);

@end

第2步:在控制器 Two 中传值。

- (void)navBack:(UIButton *)backBtn
{
 /** block 传值 */
 self.block(@"I'm from twoVC");

 [self.navigationController popViewControllerAnimated:YES];
}

第3步:在控制器 One 中接收值。

- (IBAction)pushToTwoVC:(id)sender
{
 TwoViewController *twoVC = [[TwoViewController alloc] init];
 // 实现 block,接收 twoVC 传过来的值
 twoVC.block = ^(NSString *str) {
  self.oneTextF.text = str;
 };
 [self.navigationController pushViewController:twoVC animated:YES];
}

另外还可以通过 NSUserDefaults 将值储存在本地实现逆向传值等。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • iOS通过代理逆向传值的方式详解

    前言 在iOS开发中,常见的几种逆向传值方式,有代理(delegate).通知(NSNotification),block等等,本文就给大家分析下,如何理解和快速上手代理模式,并以一个简单的逆向传值为案例,看看代理模式是不是很难. 一.代理模式中的几个概念 讲代理模式之前,首先需要弄清楚两个概念:被代理对象和代理对象.并且需要知道它们之间是靠协议关连起来的. 1.被代理对象 被代理对象往往就是真正有做事意图的那个对象,比如卖房子案例中的想卖房子的房主,保姆婴儿案例中想喝奶的婴儿.但是它们自己做不

  • iOS中详解Block作为property属性实现页面之间传值

    我们可以把Block当做Objective-C的匿名函数.Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观.另外,block的实现具有封闭性(closure),而又能够很容易获取上下文的相关状态信息.定义Block变量,就相当于定义了一个函数.但是区别也很明显,因为函数肯定是在-viewDidLoad方法外面定义,而Block变量定义在了viewDidLoad方法内部.当然,我们也可以把Block定义在-viewDidLoad方法外部,例如上面的

  • 详解iOS页面传值(顺传 逆传)

    代理协议传值 顺传 假设A为第一个视图控制器,B为第二个视图控制器 在A中导入B的.h文件 场景:A向B传值 第一步:在B的.h中定义一个content属性 @interface SecondViewController : UIViewController @property(nonatomic,copy)NSString *contents; @end 第二步:在点击A中的按钮方法里面给B的content属性赋值 - (void)buttonAction:(UIButton *)button

  • IOS使用NSUserDefault去实现界面传值和数据存储

    IOS使用NSUserDefault去实现界面传值和数据存储 系统单例NSUserDefault的传值 第一界面中 SecondViewController *secondvc = [SecondViewController new]; //创建系统单例 NSUserDefaults的实例对象 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; //存值 [defaults setObject:_firsttextf

  • iOS(闭包)block传值详解

    在iOSAPP开发的过程中 我们会用到很多需要传值的地方 传值的方式也多种多样 有:代理传值.通知传值.KVC.KVO.block.单例 等.其中block 因为其简洁实用规范的代码 无疑是大牛们传值的不二选择 但对于初学者来说要理解并能运用 起初确实有些难以理解 以下我将细细的介绍下block 首先我总结了一下block的公式: 步骤1.block 的声明 返回值类型(^block 的名字)(参数列表); 步骤2.block 实现 block的名字 = ^(参数列表)(){}; 步骤3.blo

  • iOS利用Block逆向传值的方式详解

    前言 在iOS通过代理逆向传值的方式详解一文中,分析了如何利用代理模式来逆向传值,其实还有一些其他的方式,如通知.Block等,相比较代理,我个人认为反而要简单些,但是需要处理好细节问题,如Block循环引用.还是用前文的案例,本次使用Block来实现,Block的基本知识本文不再赘述. 一.书写规范 Block传值,需要注意的是,谁传值就需要定义Block,捕获方仅仅需要传递Block给传值方,并处理捕获的值. 传值方 1.定义Block用于传值 2.声明一个上述Block属性,这个属性的具体

  • 汇总ios开发逆向传值的方法

    iOS的逆向传值有很多种方法,下面来总结几种常用的传值方式(只贴相关代码): 第一种:代理传值 第二个控制器: @protocol WJSecondViewControllerDelegate <NSObject> - (void)changeText:(NSString*)text; @end @property(nonatomic,assign)id<WJSecondViewControllerDelegate>delegate; - (IBAction)buttonClick

  • iOS通过block在两个页面间传值的方法

    一.功能需求 在第一个页面中有一个button和一个label,label上默认显示"哈哈",点击button进入第二个页面.在第二个页面有一个UITextField和一个button2,点击button2回到第一个页面,但同时第一个页面的label上显示的文字修改为刚刚在UITextField写进去的文字. 二.先定义block 在要传值得那个页面定义含有block参数的方法,即在第二个页面的.h文件中定义: 重新定义:typedef void (^ReturnTextBlock)(

  • IOS 中XAMPP配置问题及解决方法

    IOS 中XAMPP配置问题及解决方法 1.终端运行sudo /Applications/XAMPP/xamppfiles/xampp start 提示 XAMPP: Starting Apache...fail. XAMPP: Another web server is alreadyrunning. 解决 sudo apachectl stop 如果提示 /System/Library/LaunchDaemons/org.apache.httpd.plist: Could not find

  • vue中使用props传值的方法

    1.静态传值(在父组件中赋值好props中属性的值传递给子组件) 父组件 <template> <div> <input v-model="message"> <child message="hello"></child> </div> </template> <script> import child from './components/child.vue' expo

  • iOS中正向、逆向传值的方法总结

    前言 本文主要介绍了关于iOS正向.逆的相关内容,对各位iOS开发者们具有一定的参考学习价值,下面话不多说了,来一起看看详细的介绍吧 iOS 开发中经常需要在页面间传递数据,也就是 值传递.常见的有的是 正向传递 也有 逆向传递. 那么如何进行值传递呢 ?! 一.正向传递(One ---> Two) 正向传值只需要在第一个视图控制器中"拿到"第二个视图控制器,然后在跳转之前将第一个视图控制器的值赋值给第二个视图控制器所需要获得这个值的属性. 需求 假设现在有 控制器One 和 控

  • 浅谈iOS中三种生成随机数方法

    ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(time(0)); int i = random() % 5; //第三种 int i = arc4random() % 5 ; 注: ① rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样. ② arc4random() 是一个

  • 详解IOS中Tool Bar切换视图方法

    本文通过实例给大家详细讲解了IOS开发中Tool Bar切换视图方法以及原理解释,希望我们的整理对你有用,一起学习下. iOS中几种典型的多视图程序: (1)Tab Bar Application:程序的底部有一排按钮,轻触其中一个按钮,相应的视图被激活并显示出来: (2)Navigation-Based Application:其特点是使用navigation controller,而navigation controller使用navigation bar来控制多级视图: (3)Tool B

  • iOS中状态栏的基本使用方法汇总

    一.状态栏与导航栏 状态栏:显示时间.电池等信息 导航栏:显示app页面标题,返回按钮等 iOS7之前:状态栏与导航栏是分开的: iOS7之后:状态栏与导航栏合在一起:导航部分总高度(64)= 状态栏高度(20) +导航栏内容高度((44) iPhoneX设备出现以后,状态栏的高度变为44,导航栏部分总高度(88) = 状态栏(44) + 导航栏内容高度(44) 二.设置状态栏显隐与字体样式 iOS状态栏可以设置显示和隐藏,也可以设置文字的颜色.通过修改info.plist中的View cont

  • JS中Iframe之间传值的方法

    1.在iframe子页面中获取父页面的元素: a>window.parent.document这个是获取父页面document中的对象: b>如果要获取父页面js中的方法:window.parent.xxxx():xxxx()为方法: 2.在父页面中获取iframe子页面中的元素: a> var child = document.getElementByIdx_x("mainFrame").contentWindow;//mainFrame这个id是父页面iframe

随机推荐