【问题标题】:Suggestions, working with multiple controls(UIButtons)建议,使用多个控件(UIButtons)
【发布时间】:2011-07-22 13:33:53
【问题描述】:

我会尽量直奔主题...

我想构建一个包含 500 多个控件(可能远不止这些)的应用程序,并且我正在尝试设计如何尽可能高效地构建它的方法。快速概览:

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

你们会建议我做什么?我敢肯定你们中的一些人是如何遇到这样的事情的,而那些可能对如何实施或至少对其进行试验的人不太了解。

我愿意接受建议:)

【问题讨论】:

    标签: iphone objective-c ipad sdk


    【解决方案1】:

    我所做的事情是动态地建立一个大约 250 个按钮的网格,并将它们放到弹出窗口中的滚动视图中。 xib 中唯一的元素是嵌入在视图中的滚动视图。那是因为我是一个懒惰的 mofo,不想动态创建滚动视图。当您知道网格的最终内容大小时,将其传递给滚动视图

    您可以继承 UIButton 并添加 UIColor 属性或其他适用于您的系统的属性。将 UIButtons touchUp 操作指向控制器上的单个选择器,并询问发送者的相关属性。所以你的红色按钮可能有[UIColor redColor] 作为它的属性。

    另一种方法是在颜色对象的控制器上保留一个数组,并将按钮标记设置为数组索引。这意味着您不必继承 UIButton。

    假设这将在您弹出/推送视图控制器内存时即时构建不会成为问题,因为您将在关闭/弹出时将其全部丢弃。

    试试这个。

    -(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;
    
    }
    

    【讨论】:

    • 动态构建的功能将是巨大的......不过听起来像是一个可行的选择。我会记住你的答案。谢谢
    【解决方案2】:

    您可以使用IBOutletCollection。它适用于类似的要求。我将尝试粘贴一篇详细解释的博文。

    一些相关的 SO 帖子是: Practical efficient usage of IBOutletColletion

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多