iOS 页面间几种传值方式

(一)属性传值:

属性传值是最简单,也是最常见的一种传值方式,但只能正向传值(将第一个页面的值传递到第二个页面,但无法从第二个页面传到第一个页面)

比如说有两个视图控制器:AViewController和BViewController,他们之间想从A传值到B,

(1)在AViewController中导入BViewController

#import "BViewController.h"

(2)定义全局变量

比如:我们在AViewController中加一个UITextfield控件,将他的值传递到B

@property (strong,nonatomic) UITextField *textA;

(3)在AViewController.m传值的方法中传值并到BVc

-(void)test

{

BViewController *BVc=[[BViewController alloc]init];

BVc.str=self.textA.text;//str为B中定义的NSString类型变量,用于接收A中textA中内容的

[self.navigationController pushViewController:BVc animated:YES];//跳转到BVc

}

在BVIewController.h文件中

@property(strong,nonatomic) NSString *str;//接收AVc中的内容

@property(strong,nonatomic) UITextField *BText;

在BViewController.m文件中

self.BText.text=self.str;//实现接收

这样我们就可以在B中随处使用传递过来的值;

(二)Block传值

block传值是从第二个界面给第一个界面传值

首先我们在DetailViewcontrollers的.h文件中,属性

RootViewControllers的.m文件中,其他不变,在button的响应方法里我们为block属性赋值完成block传值


(三)代理传值

RootViewControllers页面push到DetailViewControllers页面,如果DetailViewControllers页面的信息想回传(回调)到RootViewControllers页面,用代理传值,其中DetailViewControllers定义协议和声明代理,RootViewControllers确认并实现代理,RootViewControllers作为DetailViewControllers的代理

首先在DetailViewControllers.h文件中我们创建协议方法

在DetailViewControllers的.m中我们判定代理对象存在时,为其绑定相应方法

RootViewControllers的.m文件中我们指定代理并让其执行代理的方法

(四)单例传值

AppStatus.h  创建一个单例类 AppStatus

 #import

 @interface AppStatus : NSObject

{  NSString *_contextStr; }

 @property(nonatomic,retain)NSString *contextStr;

+(AppStatus *)shareInstance;@end

AppStatus.m

 #import "AppStatus.h"

 @implementation AppStatus

 @synthesize contextStr = _contextStr;

  static AppStatus *_instance = nil;

+(AppStatus *)shareInstance

 {   if (_instance == nil)

  {   _instance = [[super alloc]init];  }

    return _instance; }

-(id)init

{   if (self = [super init])}

  return self; }

-(void)dealloc{   [super dealloc];

} @end

RootViewController.h


 #import "RootViewController.h"

 #import "DetailViewController.h"

 #import "AppStatus.h"

 @interface RootViewController () @end

@implementation RootViewController

-(void)loadView

{ UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

 btn.frame = CGRectMake(0, 0, 100, 30);

 [btn setTitle:@"Push" forState:0];

  [btn addTarget:self action:@selector(pushAction:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn]; }

-(void)pushAction:(id)sender

{   tf = (UITextField *)[self.view viewWithTag:1000];

//  [[AppStatus shareInstance]setContextStr:tf.text]; 跟下面这种写法是等价的

  [AppStatus shareInstance].contextStr = tf.text;

 DetailViewController *detailViewController = [[DetailViewController alloc]init];31 32   [self.navigationController pushViewController:detailViewController animated:YES];34    [detailViewController release];35 } 36 37 @end

DetailViewController.h

 @protocol ChangeDelegate;//通知编译器有此代理

 @interface DetailViewController : UIViewController

 {  UITextField *textField;}

DetailViewController.m

 #import "DetailViewController.h"

#import "AppStatus.h"

 @interface DetailViewController ()

  @implementation DetailViewController

@synthesize naviTitle = _naviTitle;

 -(void)loadView13

{    self.view = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320,480)]autorelease];

 self.title = [AppStatus shareInstance].contextStr;

 textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];

 textField.borderStyle = UITextBorderStyleLine;

[self.view addSubview:textField];

[textField release];

UIBarButtonItem *doneItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];

self.navigationItem.rightBarButtonItem = doneItem;

 [doneItem release];}

-(void)viewWillAppear:(BOOL)animated

{   [super viewWillAppear:animated];

 tf = (UITextField *)[self.view viewWithTag:1000];

 tf.text = [AppStatus shareInstance].contextStr; }

-(void)doneAction:(id)sender

{ [AppStatus shareInstance].contextStr =textField.text;

  [self.navigationController popToRootViewControllerAnimated:YES];

}

(五)通知传值

谁要监听值的变化,谁就注册通知  特别要注意,通知的接受者必须存在这一先决条件

A页面RootViewController.h

A页面RootViewController.m

 #import "IndexViewController.h"

 #import "DetailViewController.h"

 #import "AppStatus.h"

 @implementation IndexViewController

 -(void)dealloc

 {    [[NSNotificationCenter defaultCenter] removeObserver:selfname:@"CHANGE_TITLE" object:nil];

 [super dealloc]; }

-(id)init  { if (self = [super init])

 {       [[NSNotificationCenter defaultCenter] addObserver:self                                        selector:@selector(change:)name:@"CHANGE_TITLE"  object:nil]; }

 return self; }

 -(void)change:(NSNotification *)aNoti

{     NSDictionary *dic = [aNoti userInfo];

 NSString *str = [dic valueForKey:@"Info"];

 UITextField *tf =  (UITextField *)[self.view viewWithTag:1000];

 tf.text = str; }

 -(void)viewWillAppear:(BOOL)animated

{ [super viewWillAppear:animated];

UITextField *tf =  (UITextField *)[self.view viewWithTag:1000];

 tf.text = [AppStatus shareInstance].contextStr;

 @protocol ChangeDelegate;//通知编译器有此代理

 @interface DetailViewController : UIViewController

 {   UITextField *textField; }@end

DetailViewController.m

 #import "DetailViewController.h"

 #import "AppStatus.h"

@implementation DetailViewController

@synthesize naviTitle = _naviTitle;

  -(void)loadView

{     UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];

    self.navigationItem.rightBarButtonItem = doneItem;

    [doneItem release]; }

  -(void)doneAction:(id)sender

 { NSDictionary *dic = [NSDictionary dictionaryWithObject:textField.text forKey:@"Info"];

[[NSNotificationCenter defaultCenter] postNotificationName:@"CHANGE_TITLE" object:nil userInfo:dic];

[self.navigationController popViewControllerAnimated:YES];}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容