我会尝试直截了当地......
我想构建一个具有500多个控件的应用程序(可能比这更多),我正在尝试设计如何尽可能高效地构建它的方法。快速概述:
每个控件(假设它是一个UIButton,它可能是其他东西)将附加一个颜色。它们将是预定义的颜色,因此对于此应用程序,色轮将不会对我有用。所以我说,黑色,红色,蓝色......还有500个。当我点击控件时,它会改变我背景的颜色。现在,我认为我不应该在IB中手动创建一个控件来修改每种颜色。不知何故,手动过程看起来过时且效率不高。
你们建议我做什么?我相信你们当中有些人会遇到类似这样的事情,以及那些不太了解如何实施或至少试验过它的人。
我愿意接受以下建议:)
答案 0 :(得分:2)
我所做的就是动态建立一个大约250个按钮的网格,然后将它们放入弹出窗口中的滚动视图中。 xib中唯一的元素是嵌入在视图中的滚动视图。那是因为我是一个懒惰的mofo,并不想动态创建滚动视图。当您知道网格的最终内容大小时,将其传递给滚动视图
您可以继承UIButton并添加UIColor属性或其他适用于您的系统的属性。将UIButtons touchUp操作指向控制器上的单个选择器,并询问发件人的相关属性。因此,您的红色按钮可能有[UIColor redColor]
作为其属性。
另一种方法是将数组保留在颜色对象的控制器上,并将按钮标记设置为数组索引。这意味着你没有子类UIButton。
假设当你弹出/推动视图控制器内存时它将被动态构建,这将是一个问题,因为你将把它全部丢弃在dismiss / pop上。
试试这个。
-(void)viewDidLoad
{
[super viewDidLoad];
//collect all the objects
NSArray *array = [[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:@"shapes"];
NSMutableArray *temp = [NSMutableArray arrayWithCapacity:[array count]];
for(NSString *path in array)
{
[temp addObject:[path lastPathComponent]];
}
shapeArray = [[NSArray arrayWithArray:temp] retain];
//compose into a grid of buttons
CGRect final = CGRectZero;
NSInteger count = 0;
NSInteger rowsize = 6;
for (NSString *shape in shapeArray) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
NSString *ipath = [[NSBundle mainBundle] pathForResource:[shape stringByDeletingPathExtension] ofType:[shape pathExtension] inDirectory:@"shapes"];
UIImage *image = [UIImage imageWithContentsOfFile:ipath];
[button setImage:image forState:UIControlStateNormal];
div_t temp = div(count, rowsize);
button.frame = CGRectMake(48 * temp.rem , 48*temp.quot, 48, 48);
button.tag = count++;
button.showsTouchWhenHighlighted = YES;
[button addTarget:self action:@selector(pickShape:) forControlEvents:UIControlEventTouchUpInside];
[scroller addSubview:button];
final = CGRectUnion(final, button.frame);
}
scroller.contentSize = final.size;
}
答案 1 :(得分:1)
您可以使用IBOutletCollection。它的类似要求。我将尝试粘贴一篇博文,详细解释它。
一些相关的SO帖子是: Practical efficient usage of IBOutletColletion