iOS的逆向傳值有很多種方法,下面來總結幾種常用的傳值方式(只貼相關代碼):
第一種:代理傳值
第二個控制器:
@protocol WJSecondViewControllerDelegate <NSObject> - (void)changeText:(NSString*)text; @end @property(nonatomic,assign)id<WJSecondViewControllerDelegate>delegate; - (IBAction)buttonClick:(UIButton*)sender { _str = sender.titleLabel.text; [self.delegate changeText:sender.titleLabel.text]; [self.navigationController popViewControllerAnimated:YES]; }
第一個控制器:
- (IBAction)pushToSecond:(id)sender { WJSecondViewController *svc = [[WJSecondViewController alloc]initWithNibName:@"WJSecondViewController" bundle:nil]; svc.delegate = self; svc.str = self.navigationItem.title; [self.navigationController pushViewController:svc animated:YES]; [svc release]; } - (void)changeText:(NSString *)text{ self.navigationItem.title = text; }
第二種:通知傳值
第一個控制器:
//注冊監聽通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(limitDataForModel:) name:@"NOV" object:nil]; - (void)limitDataForModel:(NSNotification *)noti{ self.gamesInfoArray = noti.object; }
第二個控制器:
//發送通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"NOV" object:gameArray];
第三種:單例傳值
Single是一個單例類,並且有一個字符串類型的屬性titleName
在第二個控制器:
- (IBAction)buttonClick:(UIButton*)sender { Single *single = [Single sharedSingle]; single.titleName = sender.titleLabel.text; [self.navigationController popViewControllerAnimated:YES]; }
第一個控制器:
- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; Single *single = [Single sharedSingle]; self.navigationItem.title = single.titleName; }
第四種:block傳值
第二個控制器:
@property (nonatomic,copy) void (^changeText_block)(NSString*); - (IBAction)buttonClick:(UIButton*)sender { _str = sender.titleLabel.text; self.changeText_block(sender.titleLabel.text); [self.navigationController popViewControllerAnimated:YES]; }
第一個控制器:
- (IBAction)pushToSecond:(id)sender { WJSecondViewController *svc = [[WJSecondViewController alloc]initWithNibName:@"WJSecondViewController" bundle:nil]; svc.str = self.navigationItem.title; [svc setChangeText_block:^(NSString *str) { >self.navigationItem.title = str; }]; [self.navigationController pushViewController:svc animated:YES]; }
第五種:extern傳值
第二個控制器:
extern NSString *btn; - (IBAction)buttonClick:(UIButton*)sender { btn = sender.titleLabel.text; [self.navigationController popViewControllerAnimated:YES]; }
第一個控制器:
NSString *btn = nil; - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self.navigationItem.title = btn; }
第六種:KVO傳值
第一個控制器:
- (void)viewDidLoad { [super viewDidLoad]; _vc =[[SecondViewController alloc]init]; //self監聽vc裡的textValue屬性 [_vc addObserver:self forKeyPath:@"textValue" options:0 context:nil]; }
第二個控制器:
- (IBAction)buttonClicked:(id)sender { self.textValue = self.textField.text; [self.navigationController popViewControllerAnimated:YES]; }
其實還有很多種傳值方式,比如說NSUserDefaults,先把數據保持在本地,再讀取,或者寫入plist及其它類型的文件再讀取等等許多方式,在這裡就不一一列舉了!這些代碼寫的時間比較久了,今天整理了一下,還比較亂,有什麼不對或不足的地方請見諒!