● 控制器之间的数据传递主要有2种情况:顺传和逆传
➢ 顺传
● 控制器的跳转方向: A ->C
● 数据的传递方向 : A -> C
● 数据的传递方式 : 在A的prepareForSegue:sender:方法中根据segue参数取得 destinationViewController,
也就是控制器C, 直接给控制器C传递数据 (要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
顺传事例代码:
NJContatcsViewController.m(主控制器)
#import "NJContatcsViewController.h" #import "NJAddViewController.h" #import "NJContatc.h" #import "NJEditViewController.h" @interface NJContatcsViewController ()<UIActionSheetDelegate, NJAddViewControllerDelegate, NJEditViewControllerDelegate> /** * 点击注销按钮 */ - (IBAction)logout:(UIBarButtonItem *)sender; /** * 保存所有用户数据 */ @property (nonatomic, strong) NSMutableArray *contatcs; @end @implementation NJContatcsViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)logout:(UIBarButtonItem *)sender { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil]; [sheet showInView:self.view]; } #pragma mark - UIActionSheetDelegate - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (0 != buttonIndex) return; // 移除栈顶控制器 [self.navigationController popViewControllerAnimated:YES]; } // 无论是手动类型的segue还是自动类型的segue, 在跳转之前都会执行该方法 // 控制器跳转之前(执行segue之前)执行 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 0.判断目标控制器是添加还是编辑 // 1.取出目标控制器 UIViewController *vc = segue.destinationViewController; if ([vc isKindOfClass:[NJAddViewController class]]) { NJAddViewController *addVc = (NJAddViewController *)vc; // 2.设置代理 addVc.delegate = self; }else if ([vc isKindOfClass:[NJEditViewController class]]){ // 传递数据 NJEditViewController *editVc = (NJEditViewController *)vc; // 通过tableview获取被点击的行号 NSIndexPath *path = [self.tableView indexPathForSelectedRow]; // 取出被点击行的模型 NJContatc *c = self.contatcs[path.row]; NSLog(@"联系人列表 %p" , c); // 赋值模型 editVc.contatc = c; // 设置代理 editVc.delegate = self; } } #pragma mark - NJEditViewControllerDelegate - (void)editViewControllerDidClickSavBtn:(NJEditViewController *)editViewController contatc:(NJContatc *)cpmtatc { // 1.修改模型 // NSIndexPath *path = [self.tableView indexPathForSelectedRow]; // self.contatcs[path.row] = cpmtatc; // 2.刷新表格 [self.tableView reloadData]; } #pragma mark - NJAddViewControllerDelegate - (void)addViewControllerDidAddBtn:(NJAddViewController *)editViewController contatc:(NJContatc *)contatc { NSLog(@"添加了新联系人 %@ %@ %@", contatc.name, contatc.phoneNumber, contatc.email); // 1.保存数据到数组中 [self.contatcs addObject:contatc]; // 2.刷新表格 [self.tableView reloadData]; } - (NSMutableArray *)contatcs { if (_contatcs == nil) { _contatcs = [NSMutableArray array]; } return _contatcs; } #pragma mark - 数据源方法 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.contatcs.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *identifier = @"contatcs"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; // if (cell == nil) { // cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier]; // }re // 设置数据 NJContatc *c = self.contatcs[indexPath.row];//0 NSLog(@"cellForRowAtIndexPath %p", c); cell.textLabel.text = c.name; cell.detailTextLabel.text = c.phoneNumber; // 返回cell return cell; }
➢ 逆传 (使用代理方式)
● 控制器的跳转方向: A -> C
● 数据的传递方向 : C->A
● 数据的传递方式 : 让A成为C的代理, 在C中调用A的代理方法,通过代理方法的参数传递 数据给A
逆传事例代码: