建议,使用多个控件(UIButtons)

时间:2011-07-22 13:33:54

标签: iphone objective-c ipad sdk

我会尝试直截了当地......

我想构建一个具有500多个控件的应用程序(可能比这更多),我正在尝试设计如何尽可能高效地构建它的方法。快速概述:

每个控件(假设它是一个UIButton,它可能是其他东西)将附加一个颜色。它们将是预定义的颜色,因此对于此应用程序,色轮将不会对我有用。所以我说,黑色,红色,蓝色......还有500个。当我点击控件时,它会改变我背景的颜色。现在,我认为我不应该在IB中手动创建一个控件来修改每种颜色。不知何故,手动过程看起来过时且效率不高。

你们建议我做什么?我相信你们当中有些人会遇到类似这样的事情,以及那些不太了解如何实施或至少试验过它的人。

我愿意接受以下建议:)

2 个答案:

答案 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