pro-- 通讯录4--正向逆向数据传递总结

来源:互联网 发布:淘宝卖家关闭订单付款 编辑:程序博客网 时间:2024/05/17 14:20

文顶顶通讯录1--数据正传  ---   http://www.cnblogs.com/wendingding/p/3773603.html

文顶顶通讯录2--数据逆传 ---  http://www.cnblogs.com/wendingding/p/3777087.html

---------------------------

一、数据的逆传(使用代理) 

通过上述我们可以知道代理就是对象A监听对象B,A一般是控制器,B一般是控件(当然也可能是控制器)。
实现代理的三个步骤:
1、设置代理:设置监听对象A为代理B.delegate = self(A);
2、遵守协议:遵守的是被监听对象B的协议,所以协议是定义在对象B中的。在对象A中引入代理
3、实现协议方法:在对象A中实现协议中的方法
自定义代理:
ContactViewController作为AddViewController的代理

1、首先在AddViewController中定义一个协议,协议中定义一个需要代理对象需要实现的方法(这里是C-C的,为了传递数据,所以方法中应该有参数用来传递数据),

同时还应该在AddViewController中定义一个属性delegate

#import <UIKit/UIKit.h>@class MJContact, MJEditViewController;@protocol MJEditViewControllerDelegate <NSObject>@optional- (void)editViewController:(MJEditViewController *)editVc didSaveContact:(MJContact *)contact;@end@interface MJEditViewController : UIViewController@property (nonatomic, strong) MJContact *contact;@property (nonatomic, weak) id<MJEditViewControllerDelegate> delegate;@end


2、在ContactViewController中的btnClick的方法中(实际是从Contact--Add 的方法中),在页面跳转之前设置代理,addVc.delegate = self;(别忘了遵守协议!)

storyBoard是在

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
。。。。。。。
<pre name="code" class="objc"> editVc.delegate = self;

}

3、在AddViewController中addBtn的方法中,在出栈的同时通知代理调用代理方法

//使用代理,自定义一个代理,并使用代理传递数据

 //如果代理方法存在就通知代理调用该方法,传递数据

79     if ([self.delegate respondsToSelector:@selector(addViewControllerDidAddBtn:contatc:)]) {
80         NSLog(@"sadafaf");
81         [self.delegate addViewControllerDidAddBtn:self contatc:info];
82     }

------------------------------------------------------------------------------------------------------------------------------------

二、数据的正传(1、Navigation中的数据。2、其他控件中的数据)

 *  执行跳转之前会调用 *  在这个方法中,目标控制器的view还没有被创建, 所以对于<查看联系人> 页面的数据添加不应该放在setContact中,而是应该放在ViewDidLoad中设置// 数据的正向传递:将被点击的cell的数据从ContactList --》 Edit ContactsList -- 》 Edit在 ContactViewController向EditViewControllert跳转的方法中(比如EditBtnClick)将数据传递给EditViewController<pre name="code" class="objc" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 26px;">//在EditViewController定义一个public模型属性,我们在View创建之前将模型数据传递给Edit,
<span style="white-space:pre"></span>但是在ViewDidLoad中进行数据的赋值,而不是setContact中
editVc.contact = self.contacts[path.row];

//数据的正向传递顺传数据的时候不要重写set方法,要在ViewDidLoad方法中取得数据,来赋值给界面上的UI控件。
因为set方法使用的时候,EditView还没有创建出来。
因为控制器View 是延迟加载的,什么时候用到什么时候创建,在传递模型数据的那一刻没有做跳转的动作(我们所进行的操作都是在页面跳转之前进行的)
 */- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
 id vc = segue.destinationViewController; 
if ([vc isKindOfClass:[MJAddViewController class]])
 { // 如果是跳转到添加联系人的控制器 // 设置下一个控制器(添加联系人的控制器)的代理 
   MJAddViewController *addVc = vc; addVc.delegate = self; } 
else if ([vc isKindOfClass:[MJEditViewController class]]) { 
// 如果是跳转到查看(编辑)联系人的控制器 
MJEditViewController *editVc = vc; 
// 取得选中的那行
 NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 
editVc.contact = self.contacts[path.row];//在EditViewController定义一个public模型属性,我们在View创建之前将模型数据传递给Edit,但是在ViewDidLoad中进行数据的赋值
 editVc.delegate = self; }}

-------------------------------------------------

//在segue跳转之前会调用这个方法,会传入performSegueWithIdentifier方法创建好的segue对象
这里使用的是storyBoard。  ----  来处理XXX的联系人列表(从LogViewController中获取数据)125 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender126 {127     NSLog(@"%@",sender);128     //数据的正向传递129     //1.拿到目标控制器130     UIViewController *vc=segue.destinationViewController;131     //2.设置目标控制器的标题132     vc.title=[NSString stringWithFormat:@"%@的联系人列表",self.numberField.text];133      140 }


0 0