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];}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容