• iOS:控制器间的数据传递


      在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递。顺传递是指数据的传递方向和控制器的跳转方向相同(如图1);逆传递是指数据的传递方向和控制器的跳转方向相反(如图2)。这里分别介绍这两种传递方式的具体做法。

    顺传递

    如果是用的SB,顺传递较简单,只需在A控制器的prepareForSegue:sender:方法中根据segue参数取得destinationViewController,也就是目标控制器C,直接给控制器C传递数据。从A传来的数据要在C的viewDidLoad方法中取得,进而利用数据做一些业务操作,如给C上的UI控件赋值。

    逆传递

    逆传递或者非SB开发需要用到代理模式,简单来讲就是:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A。具体可分为以下三个步骤:

    • 1.在C的.h文件中定义协议(协议就是一堆方法的声明,这些方法的具体实现是给遵守协议的A去完成的)并添加一个delegate属性用于设置代理对象;
    • 2.在C的m文件中也要调用该代理方法通知其代理;
    • 3.A遵守协议,实现代理方法。

    案例:

     点击A中的“请选择”,跳转到C控制器,选中对应的数据行后返回到A并将选中的数据传递给A进行显示(如下图)。

                                

                                               A                                                  C                                                  A

    1.在控制器C的.h文件中定义协议并添加delegate属性:

     1 #import <UIKit/UIKit.h>
     2 
     3 @class SelectDeptViewController, Department;
     4 
     5 @protocol SelectDeptViewControllerDelegate <NSObject>
     6 
     7 @optional
     8 
     9 - (void)selectDeptViewController:(SelectDeptViewController *)selectDeptVC didSelectDept:(Department *)department;
    10 
    11 
    12 @end
    13 
    14 @interface SelectDeptViewController : UITableViewController
    15 
    16 @property (nonatomic, weak) id<SelectDeptViewControllerDelegate> delegate;
    17 
    18 @end

    2.在控制器C的.m文件中调用代理方法,将数据通过代理方法传递给其代理:

     1 #pragma mark - UITableView Delegate
     2 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
     3 {
     4     if ([self.delegate respondsToSelector:@selector(selectDeptViewController:didSelectDept:)]) {
     5         Department *dept = self.departments[indexPath.row];
     6         [self.delegate selectDeptViewController:self didSelectDept:dept];
     7     }
     8     
     9     // 关闭当前控制器
    10     [self.navigationController popViewControllerAnimated:YES];
    11 }

    3.A控制器实现C的代理方法,拿到数据进行业务操作:

    1 # pragma mark - SelectDeptViewControllerDelegate方法
    2 
    3 - (void)selectDeptViewController:(SelectDeptViewController *)selectDeptVC didSelectDept:(Department *)department
    4 {
    5     self.department.text = department.name;
    6 }

     总结:

      其实iOS开发中的代理模式非常常见。比如TableView要显示数据,但是它自己是没有数据的,数据在控制器里,这就涉及到TableView访问控制器里数据的需求,我们通过代码或拖线的方式让控制器成为TableView的代理,并在控制器中实现TableView的代理方法。

  • 相关阅读:
    CSS3嵌入web字体与布局
    Hbase 技术细节笔记(下)
    Hbase 技术细节笔记(上)
    全排列算法(递归和字典)
    一分钟掌握位运算符—与(&)、非(~)、或(|)、异或(^)
    MySQL中count函数使用方法详解
    ZAB协议与Paxos算法
    泊松分酒(穷举法)
    hadoop解决Could not locate executable nullinwinutils.exe in the Hadoop binaries.问题
    Redis系列八:redis主从复制和哨兵
  • 原文地址:https://www.cnblogs.com/yif1991/p/5077192.html
Copyright © 2020-2023  润新知