#import <UIKit/UIKit.h>
@interface UIScrollView (closeCombox)
@property(nonatomic,assign)BOOL haveCombox;
-(void)closeAllTheComBoxView;
@end
#import "UIScrollView+closeCombox.h"
#import "LMComBoxView.h"
@implementation UIScrollView (closeCombox)//synthesize not allowed in a category's implementation 继承父类可以扩展属性
//@synthesize haveCombox;
//此处若在initWithFrame方法里面添加通告,会导致整个程序非常的卡顿!!!
-(void)closeAllTheComBoxView
{
for(UIView *subView in self.subviews)
{
if([subView isKindOfClass:[LMComBoxView class]])
{
LMComBoxView *combox = (LMComBoxView *)subView;
if(combox.isOpen)
{
[UIView animateWithDuration:0.3 animations:^{
CGRect frame = combox.listTable.frame;
frame.size.height = 0;
[combox.listTable setFrame:frame];
[combox.listTable removeFromSuperview];
} completion:^(BOOL finished){
combox.isOpen = NO;
combox.arrow.transform = CGAffineTransformRotate(combox.arrow.transform, DEGREES_TO_RADIANS(180));
}];
}
}
}
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if(self.haveCombox)
{
[self closeAllTheComBoxView];
}
}
@end
但是发现会报错:synthesize not allowed in a category's implementation
尝试自己写set和get方法也不行。
ps:还有一个问题,如果在类别的初始化方法里面添加了一些代码,比如加入我上面这样写:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(closeAllTheComBoxView) name:@"save" object:nil];
}
return self;
}
会导致整个程序非常的卡顿,程序中用到的第三方的下拉加载上拉刷新的UITableView也会非常非常的卡顿,会感觉拖不动,而且UITableView的下拉加载的视图也会漂浮起来。(当时把我吓坏了!)这就是使用类别不当导致的严重后果!
后来我就果断用继承了,我写了一个LMContainsLMComboxScrollView : UIScrollView类,就是包含了LMComboxView的UIScrollView,并在它里面实现触摸收起界面上的所有展开了的下拉列表。
======================================================================
回想一下iOS里面的类别和继承的区别才知道自己犯错了。之前只是看了下概念性的区别,真正自己写代码中遇到了,才能真正体会到它们的区别。
下面是类别和继承的一点区别:
1.Category (分类)可以拓展这个类.添加额外的方法.
Category(分类)使得在不修改该类原先代码的情况下.拓展或者修改现有类的定义.并且是向下有效的.既会影响到该类所有子类.
重写一个类的方式用继承还是分类.取决于具体情况.假如目标类有许多的子类.我们需要拓展这个类又不希望影响到原有的代码.继承后比较好.
如果仅仅是拓展方法.分类更好.(不需要涉及到原先的代码)
2.分类:用来扩展类的方法,不能定义新成员,但是可以访问到私有成员
子类:可以通过覆盖和定义新方法来扩展父类,可以新增成员,但是不能访问父类的私有成员。
我就是没有理解上面两点区别才导致这种错误。在类别中重写了初始化方法,所有影响了所有UIScrollView的子类,导致了程序非常的卡顿。另外分类只能扩展类的方法,不能定义新的成员。