_ Xcode中生成UI控件的方式有storyboard和纯代码生成。当需要生成不定量个数的控件或控件的自定义程度比较高时,纯代码生成的控件就比较好。并且纯代码生成的控件,可控性比较好。毕竟都是自己写的代码,具体实现的细节都很清楚。
_ 在生成不定量的控件时,基本思路是使用for循环根据数据中需要显示的个数动态生成相应的控件,并把控件加到对应的view中。下面的代码存在一些问题,一起分析一下。
- (void)buildButtonWithArray:(NSArray *)infoArray
{
for (int i = 0; i < infoArray.count; i++)
{
UIButton *button = [UIButton new];
NSDictionary *infoDic = infoArray[i];
if (infoDic[@"title"])
{
[button setTitle:infoDic[@"title"] forState:UIControlStateNormal];
}
else
{
NSLog(@"title is nil.");
}
[self.buttonArrray addObject: button];
[self.view addSubview:button];
CGFloat x, y, w, h;
w = 50.0;
h = 50.0;
x = i *w;
y = 0.0;
button.frame = CGRectMake(x, y, w, h);
}
}
_ 1. 很明显每次调用这个方法时,都会生成3个新的UIButton实例放在self.buttonArrray可变数组中。并且覆盖在之前button之上,如果多次调用,多可怕。。。
解决办法:把可变数组变成可变字典,使用可唯一确定的字符串作为key。当调用这个方法时,先判断字典中是否存在一样key的UIButton,如果没有再生成新的UIButton。如果存在,直接修改相应属性就可以了。避免重复生成相同功能的控件,而且可以在类的其它方法中使用。
_ 2.UIButton的位置不应该在for循环中设置,应在另一个方法中实现。因为控件的位置是会变化的,如果每次刷新控件位置都要走一遍生成控件的代码,就算按照1.中的修改了。也会影响软件的性能。把复杂的功能拆分成多个小功能模块,有利于方法的复用。