● 控制器之间的数据传递主要有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;
    
}
View Code

 

➢ 逆传 (使用代理方式)
● 控制器的跳转方向: A -> C

●  数据的传递方向 : C->A

●  数据的传递方式 : 让A成为C的代理, 在C中调用A的代理方法,通过代理方法的参数传递 数据给A 

 

逆传事例代码:

 

相关文章: