循环通过类似命名的控件

时间:2009-06-23 16:22:56

标签: objective-c cocoa

我有view0到view25。我不是特别想要一个25个案例的开关,所以有办法做这样的事情吗?

- (void)modifyViewNumber:(int)number
{
     [view*number* dosomething];
}

9 个答案:

答案 0 :(得分:7)

在启动时将视图放入数组中。

答案 1 :(得分:3)

您可以在每个视图上放置一个标记,并使用以下方法使用for循环:

- (id)viewWithTag:(NSInteger)aTag

答案 2 :(得分:3)

还没有人建议NSMatrix吗?这听起来像是为它制作的。

需要注意的是,视图必须都是控件,例如文本字段或按钮。基本上,查看它的类引用,看看它是否在某些时候继承自NSControl。如果它通过了那个测试,那么NSMatrix就是一个选择。 (这里是the list of all AppKit classes,以简化这一点。)

要控制IB中的矩阵,以通常的方式创建一个控件,然后选择 - 拖动其调整大小句柄。它一开始似乎没有做任何事情,但继续拖动。而不是调整大小,你的控制权将会激增;它现在是一个细胞矩阵而不是一个单一的控制。

答案 3 :(得分:1)

为什么不将视图放入数组并使用数组索引获取对它们的引用?

- (void)modifyViewNumber:(int)number
{
    UIView* view = [views objectAtIndex:number];
    [view dosomething];
}

答案 4 :(得分:1)

很多人都说使用数组 - 我一直这样做,这是使用界面构建器时唯一的方法,但我想添加一点。

有时将值放入数组可能会很棘手。通常有一种方法可以在屏幕上获取所有控件的数组。通常我会抓住它并迭代它寻找具有某种命名模式的控件类型并将它们收集到我自己的数组中。

通过这种方式,您通常可以添加一个没有任何代码更改的新控件(总是我最喜欢的目标之一)。

答案 5 :(得分:0)

创建一个视图数组。按顺序添加每个,然后通过数组索引引用它。

如果数字不是连续的,请使用哈希表。

反思可能是一种选择,但可能会更慢(我不是一名Objective C大师,甚至不知道这是否合适)。

答案 6 :(得分:0)

我假设您正在使用Interface Builder来设置这些视图?

有人可能需要纠正我,但我相信您可以在班级中创建一个NSArray Interface Builder插座,然后将所有视图分配给它。例如,您可以声明“IBOutlet NSArray * views;”在头文件中,然后使用界面构建器绑定将所有25个视图绑定到该属性。它们将自动添加到数组中,然后您可以在代码中对其进行干净迭代。

答案 7 :(得分:0)

使用集合或Reflection

答案 8 :(得分:0)

假设接口生成器(以前的回答是直截了当的)。这是我能管理的最好的:

在.h:

{
    UILabel         *banner[NUM_BANNERS];
}
@property (nonatomic, retain) IBOutlet UILabel *banner0;
@property (nonatomic, retain) IBOutlet UILabel *banner1;
@property (nonatomic, retain) IBOutlet UILabel *banner2;
etc.

在.m:

- (void)viewDidLoad
{
    banner[0] = banner0;
    banner[1] = banner1;
    banner[2] = banner2;
    etc.

然后可以通过数组索引访问。记得发布。