以实例讲解Objective

网友投稿 210 2023-07-29


以实例讲解Objective

KVO实例浅析

最近遇到个问题,在处理项目中一个评论界面时,因为直接用的是UIWebView展示评论列表,结果取到的页面上下都有一段CGSize为(320,65)的乱七八糟的广告,十分碍眼.头部广告因很方便的在头部坐标贴上自己的logo解决了,但是尾部的,因为每个页面的评论长短不一,坐标也就不一样,这样就不能给定死坐标去贴logo,思前想后,通过KVO很好的解决了这个问题.

@KVO概述:

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。

简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

使用步骤如下:

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 触发回调方法  

4. 移除观察

代码实例:

复制代码 代码如下:

-(void)viewDidLoad{ 

 

    // KVO,作为一个观察者,只要属性"contentSize"发生变化,回调方法里面就会通知 

    [_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:NULL]; 

 

//  回调方法 

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

    if(object == _webView.scrollView && [keyPath isEqualToString:@"contentSize"]) 

    { 

        //  得到最大的Y坐标 

        CGSize size = _webView.scrollView.contentSize; 

       

        if (size.height > 568.0) { 

             

            // 遮挡广告 

            _hideBottomImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, size.height-67, ScreenWidth, 67)]; 

            _hideBottomImage.image = [UIImage imageNamed:@"banner"]; 

            [_webView.scrollView addSubview:_hideBottomImage]; 

            [_hideBottomImage release]; 

        } 

    } 

    else 

    { 

        //  调用父类的方法 

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

    } 

 

- (void)dealloc{//---->在ARC环境下也能调用dealloc方法,只是不需要写[super dealloc] 

 

    // 移除KVO,否则会引起资源泄露  

    [_webView.scrollView removeObserver:self forKeyPath:@"contentSize"]; 

    [super dealloc];   

 

}

上面是针对contentSize属性,其他属性依此类推

KVC

通常,我们都是通过属性的set和get方法来赋值和取值,这里介绍用Key-Value-Coding(KVC)键值编码来给类的属性赋值和取值.

1.基本方式(setValue:forKey:      valueForKey)

复制代码 代码如下:

//  ---定义一个Student类(.m文件无任何操作) 

#import  

 

 

@class HMTClass; 

@interface HMTStudent : NSObject{ 

 

    NSString * _name; 

    

    BOOL _test; 

    BOOL _isTest; 

    BOOL test; 

    BOOL isTest; 

 

 

@property (nonatomic,copy)NSString * name; 

@property (nonatomic,copy)NSString * sex; 

@property (nonatomic,assign)NSInteger age; 

@property (nonatomic,strong) HMTClass * hmtClass; 

 

@end 

 

//  ---main文件 

HMTStudent * student = [[HMTStudent alloc] init]; 

     

student.hmtClass = [[HMTClass alloc] init]; 

student.name = @"humingtao”;     //  set方法赋值

   

//  KVC赋值    

[student setValue:@“mawei is dog" forKey:@"name”];  

[student setValue:@"m" forKey:@"sex"]; 

[student setValue:@(10) forKey:@"age"]; 

//  取值     

NSLog(@"%s__%d__|%@",__FUNCTION__,__LINE__,[student valueForKey:@"name"]);

特别注意:

我在类里面还定义了4个BOOL值变量,用来验证KVC访问属性键顺序

[student setValue:@(YES) forKey:@"test”];

结果是:_test—>_isTest—>test—>isTest

2.键路径访问(用于一个类中属性的属性 setValue:ForKeyPath: forKeyPath)

复制代码 代码如下:

//  创建一个班级类 

@interface HMTClass : NSObject 

 

@property (nonatomic,copy)NSString * name; 

 

@end

然后前面第一点中在Student类中写了一个班级属性hmtClass

复制代码 代码如下:

HMTClass *hmtClass = [[HMTClass alloc]init]; 

[hmtClass setValue:@"宇宙一班" forKey:@"name"]; 

[student setValue:hmtClass forKey:@"hmtClass"]; 

NSString *hmtClassName = [student valueForKeyPath:@"hmtClass.name"]; 

 

//也可以这样存值 

[student setValue:@"宇宙一班" forKeyPath:@"hmtClass.name"]; 

student.hmtClass.name = [student valueForKeyPath:@"hmtClass.name"];

3.自动封装基本数据类型

我们在Student类中添加分数属性 NSInteger number 学号;

复制代码 代码如下:

#import    

@class HMTClass;   

@interface HMTStudent : NSObject   

{   

    NSString *_name;   

 

    NSInteger number;   

}   

@end   

 

[student setValue:@"100" forKeyPath:@"number"];   

NSString *number = [student valueForKey:@"number"];

可见用NSString*类型

设置的属性值@"100",而我们的属性是NSInteger类型的,存取都没有问题。

4.操作集合

在Student类中加入数组NSArray,用来表示其他的学生。

复制代码 代码如下:

#import    

@class HMTClass;   

@interface HMTStudent : NSObject   

{   

    NSArray *manyStudents;   

}   

@end   

           

Student *student1 = [[HMTStudent alloc]init];   

Student *student2 = [[HMTStudent alloc]init];   

Student *student3 = [[HMTStudent alloc]init];   

[student1 setValue:@"200" forKey:@"number"];   

[student2 setValue:@"300" forKey:@"number"];   

[student3 setValue:@"400" forKey:@"number"];   

NSArray *array = [NSArray arrayWithObjects:student1,student2,student3,nil];   

[student setValue:array forKey:@"manyStudents"];   

NSLog(@"%@",[student valueForKeyPath:@"manyStudents.number"]);

打印出来是数组(200,300,400)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:window.onload使用指南
下一篇:微信企业号开发之微信考勤百度地图定位
相关文章

 发表评论

暂时没有评论,来抢沙发吧~