OC的学习中,在学了一段时间的UI后,发现每次在添加控件到主视图中时都要
<span style="font-size:14px;">[addSubview:aView];
[aView release] ; </span>
如果一个界面中有好多的子视图要添加就显得很麻烦了。于是想到之前在C中学习的变参函数。而在 OC 中我们也经常会用到,比如在初始化数组或字典的时候有
+ (id)arrayWithObjects:(id)firstObj, …
于是乎,想到通过类目来拓展 UIView 添加子视图的方法。按住 command 鼠标点击,进入
+ (id)arrayWithObjects:(id)firstObj, …
这个方法的头文件,看到这样的申明方式:
<span style="font-size:14px;">+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;</span>
这个跟自己想象的声明方式差不多,不过在最后添加了
NS_REQUIRES_NIL_TERMINATION
的标识,翻译过来就是说 要求以 nil结束。这刚好也符合自己的需求。于是也尝试做了以下的方法声明:
@interface UIView(LinAddView)
- (void)addSubviews:(UIView *)firstView, ... NS_REQUIRES_NIL_TERMINATION;
@end
并在 .m 文件中做了实现(跟C差不多,还是用到了关于变参的一组宏:va_start, va_arg, va_end, 以及一个指向变参类型的指针类型 va_list),如下:
@implementation UIView(LinAddView)
- (void)addSubviews:(UIView*)firstView, ... NS_REQUIRES_NIL_TERMINATION
{
va_list list; //指向变参的指针
va_start(list, firstView); //使用第一个参数来初使化list指针
[self addSubview:firstView]; //添加视图
while( YES )
{
//返回可变参数,va_arg第二个参数为可变参数类型,如果有多个可变参数,依次调用可获取各个参数
UIView *view = va_arg(list, UIView*);
if( view == nil )
{
break;
}
[self addSubview:view]; //添加视图
}
//结束可变参数的获取
va_end(list);
}
@end
这样就实现了变参方法。以上方法当需要一次性添加多个视图的时候便可以很方便的使用了。
这时想到,如果想添加后并 release 子视图的话呢?很简单,可以再写个方法,如下:
- (void)addSubviewsAndRelease:(UIView *)firstView, ... NS_REQUIRES_NIL_TERMINATION;
实现:
@implementation UIView(LinDetailViewController)
- (void)addSubviews:(UIView*)firstView, ... NS_REQUIRES_NIL_TERMINATION
{
va_list list;
va_start(list, firstView);
[self addSubview:firstView];
[firstView release];
while( YES )
{
UIView *view = va_arg(list, UIView*);
if( view == nil )
{
break;
}
[self addSubview:view];
[view release];
}
va_end(list);
}
@end