文档章节

KVO 实现两个页面之间的通信

木木情深
 木木情深
发布于 2014/01/15 18:03
字数 749
阅读 586
收藏 4

实现功能描述(简单说明):在图1中结算页面点击相关控件(如图1中橙色方框标注的位置),推出图2地址选择页面或者图3所示的发票台头填写页面。

                          图1 结算

                          图2 地址选择

                          图3 输入发票台头 

说明:由于这个Demo中的图1点击时,推出的页面很多(这里的图片都只是显示了一部分),并且不定,我这里采用的方案是:

1. 定义一个改变UI的protocol

@protocol  LYGAddressProtocal <NSObject>


-(void)backToPreviousVC;

-(void)changeContentWithContentNum:(int)contentNum;

-(void)refreshUIWithStr:(NSString *)str andContentNum:(int)contentNum;


2. 定义两个继承自 UIViewController

结算页面类:

@interface  LYGPayViewController : UIViewController

被推出页面的类:

@interface  LYGAddressViewController : UIViewController<LYGAddressProtocal>

//声明 监听对象

@property (nonatomic,copy) NSString *userInfo;

@property (nonatomic,copy) NSString *transforWayStr;


@property (nonatomic,weak)LYGFaPiaoView *faPiaoVC;


3. 创建各种相对应的 xib;

emptyAddress.xib

selectAddress.xib

transformTime.xib

......

4.  自定义相应的各种继承自 UIView的类,将其与步骤3中创建的xib关联起来

@interface  LYGEmptyAddressView : UIView

@interface  LYGSelectAddVIew : UIView

@interface  LYGTransformTimeView : UIView

......

5. 在步骤2中创建的类中,示例化各种类(示例)

LYGEmptyAddressView *emptyAddressView = [[NSBundle mainBundle]loadNibNamed:@"emptyAddress" owner:nil options:nil][0];

emptyAddressView.delegateVC = self;

emptyAddressView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

[self.view addSubview:emptyAddressView];


-(void)refreshUIWithStr:(NSString *)str andContentNum:(int)contentNum

{    

    switch (contentNum) {

        case 01:

            self.userInfo = str;//使用点语法

            break;

        case 10:

            [self setValue:str forKey:@"transforWayStr"];// 遵从KVC编码风格设置key-value

            break;

        default:

            break;

    }

}


在自定义的继承自view的类中调用上面的刷新页面函数

6. 在 结算类 .m 文件中注册监听者,并且实现监听回调函数

static void* userInfo = (void *)&userInfo;

static void* transforWayStr = (void *)&transforWayStr;


LYGAddressViewController *addVC = [[LYGAddressViewController alloc]initWithNibName:@"LYGAddressViewController" bundle:nil];

  

    [addVC addObserver:self forKeyPath:@"userInfo" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:userInfo];

    

    [addVC addObserver:self forKeyPath:@"transforWayStr" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:transforWayStr];

.......

#pragma mark 监听回调函数

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    NSLog(@"-----observer-----");

    if (context == userInfo) {

        NSString *oldStr = [change objectForKey:@"old"];

        NSString *newStr = [change objectForKey:@"new"];

        self.myAddInfoLabel.text = newStr;

    }

    else if(context == transforWayStr)

    {

        NSString *oldStr = [change objectForKey:@"old"];

        NSString *newStr = [change objectForKey:@"new"];

        self.myTransforGoodsWayLabel.text = newStr;

    }

    else

    {

        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

    }

}


注:对于监测对象中对象的属性的情况,须使用方法(都必须遵守KVC编码格式)

setValue:<#(id)#> forKeyPath:<#(NSString *)#>(正确)

不能在使用:

setValue:<#(id)#> forKey:<#(NSString *)#>(错误)

示例:

[self.delegateVC setValue:self.myInvoiceTextFeild.text forKeyPath:@"invoiceVC.myInvoiceTextFeild"];

[self.delegateVC setValue:self.myInvoiceTextFeild.text forKeyPath:@"invoiceVC.myInvoiceTextFeild.Text"];


对于第一种需要回调函数种需要做特别的判断,第二种则不需要新值一直是NSString类型的 。


第一种注册监听:

[addVC addObserver:self forKeyPath:@"invoiceVC.myInvoiceTextFeild" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:invoiceStr];

第一种回调函数

       NSString *oldStr = [change objectForKey:@"old"];

        id newObj = [change objectForKey:@"new"];        

        

        if([newObj isKindOfClass:[NSString class]])

        {

            NSString *s = newObj;

            self.myInvoiceLabel.text = s;

        }

        else if ([newObj isKindOfClass:[UITextField class]])

        {

            UITextField *ff = newObj;

            self.myInvoiceLabel.text = ff.text;

        }


第二种注册监听:

[addVC addObserver:self forKeyPath:@"invoiceVC.myInvoiceTextFeild.Text" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:invoiceStr];

第二种回调函数

       NSString *oldStr = [change objectForKey:@"old"];

       NSString *newStr = [change objectForKey:@"new"];        

       self.myInvoiceLabel.text = newStr;

     

运行效果图:




© 著作权归作者所有

木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
私信 提问
iOS之观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 在iOS中典型的观察者模式实现方式为NSNotificat...

iOS俱哥
2016/11/20
0
0
KVC、KVO、Notification、Delegate代码实现及比较

一、KVC 即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。 二、KVO 的是...

_子墨
2016/02/24
380
0
马上着手开发 iOS 应用程序 至 读后笔记

目标-操作机制: 当用户轻按“Hello”按钮时,您想要按钮发送一则“更改问候语”的消息(操作)给视图控制器(目标)。 实现文件中的类扩展是申明类的专有属性和方法的地方。 IBAction 是一个...

芒果阿狸
2012/12/11
0
0
iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC、KVO、NSNotification、delegate 总结及区别 1、KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问...

PandaEyes
2016/06/22
11
0
iOS面试题总结(三)

iOS面试(三) 1.MVC具有什么样的优势,各个模块之间怎么通信,比如Button后怎么通知Model MVC是一种设计思想,是一种架构模式,是一种把应用所有类组织起来的策略。他们把程序分成3块。 M: 存储...

沧州宁少
2017/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

高并发场景下的缓存有哪些常见的问题?

一、缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。 这就比较依赖缓存的过期和更新...

别打我会飞
33分钟前
2
0
List list = new ArrayList()为何父类引用指向子类对象(多态)

态:要有继承,方法的重写,父类引用指向子类对象 疑问一:父类引用指向子类对象 与指向父类对象 Animal cat = new Cat(); //向上转型。 父类引用指向子类对象,该引用不能再访问子类新增加的...

architect刘源源
33分钟前
2
0
分而治之-快速排序

快速排序的思想: 快速排序首先在数组中确定1个枢纽项(比如数组中的第一个元素),将大于该枢纽项的元素放到右侧,小于该枢纽项的元素放到左侧,这样枢纽项将数组划分成两部分。接着继续对划...

万山红遍
今天
5
0
Qt编写自定义控件9-导航按钮控件

前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2属...

飞扬青云
今天
4
0
Python开发工具:pyJasper

原文:https://www.oschina.net/p/pyjasper 前言 pyJasper是 JasperReports 网络服务器的 Python 客户端。 pyJasper 是一组 Python 基础工具,可以用来处理 JasperReports 报表 。因为 Jasper...

A_裙232550246
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部