从单个方法实例化一定数量的唯一对象
Posted
技术标签:
【中文标题】从单个方法实例化一定数量的唯一对象【英文标题】:Instantiating a set amount of unique objects from a single method 【发布时间】:2010-11-04 18:58:44 【问题描述】:这是我一直无法理解的事情......
假设我正在构建一个宽 8 个 UIViews 高 8 个 UIViews 的网格。它可以由任何 x, y 集合。它不必是 8 x 8。让我们随意并暂时坚持下去。
这个 init 方法(UIView 子类的一部分)生成一行 8 个 UIView 宽:
- (id)initWithFrame:(CGRect)frame
if ((self = [super initWithFrame:frame]))
int x = 1;
int y = 1;
//row 01
UIView* row01Square01 = [[UIView alloc] initWithFrame:CGRectMake((0*x), (0*y), x, y)];
[self addSubview:row01Square01];
UIView* row01Square02 = [[UIView alloc] initWithFrame:CGRectMake((1*x), (0*y), x, y)];
[self addSubview:row01Square02];
UIView* row01Square03 = [[UIView alloc] initWithFrame:CGRectMake((2*x), (0*y), x, y)];
[self addSubview:row01Square03];
UIView* row01Square04 = [[UIView alloc] initWithFrame:CGRectMake((3*x), (0*y), x, y)];
[self addSubview:row01Square04];
UIView* row01Square05 = [[UIView alloc] initWithFrame:CGRectMake((4*x), (0*y), x, y)];
[self addSubview:row01Square05];
UIView* row01Square06 = [[UIView alloc] initWithFrame:CGRectMake((5*x), (0*y), x, y)];
[self addSubview:row01Square06];
UIView* row01Square07 = [[UIView alloc] initWithFrame:CGRectMake((6*x), (0*y), x, y)];
[self addSubview:row01Square07];
UIView* row01Square08 = [[UIView alloc] initWithFrame:CGRectMake((7*x), (0*y), x, y)];
[self addSubview:row01Square08];
return self;
是否可以编写一个方法来使用该代码(当然要进行修改)来生成随后的 7 行 UIView?更好的是,是否可以使用 1 行来生成所有 64 个 UI 视图?
我已经尝试过使用 for、while、do 循环,但我承认我完全不知道是否可以将字符串作为参数传递给 init 方法。
提前感谢您对此的任何见解。
【问题讨论】:
请记住,您还需要在添加 UIView 后释放它们。 【参考方案1】:你的意思是:
for (int i=0;i<8;i++)
UIView* square = [[UIView alloc] initWithFrame:CGRectMake((i*x), (0*y), x, y)];
[self addSubview:square];
或者(对于所有行):
for(int r=0;r<8;r++)
for (int i=0;i<8;i++)
UIView* square = [[UIView alloc] initWithFrame:CGRectMake((i*x), (r*y), x, y)];
[self addSubview:square];
【讨论】:
好的,这部分是有道理的。让我感到困惑的部分是如何访问由此代码在其他地方生成的单个 UIView 之一。我的直觉告诉我,我会在循环中添加一个 setTag 行,然后使用 viewWithTag 访问特定实例。 好吧,您知道它们的创建顺序,因此它们将在 self.subViews 中按该顺序排列,您可以使用 objectAtIndex 检索特定的,或者是的,您可以循环遍历。 试图通过索引访问 self.subviews 来获取特定视图是脆弱的。您最好为每个视图添加标签并通过标签访问它们,或者将对子视图的引用存储在数组成员变量中。如果您不需要在从超级视图中删除视图后访问视图,则使用标签可能是最好的方法。【参考方案2】:int numberOfRows = 8;
int numberOfColumns = 8;
for (int j = 0; j<numberOfRows;j++)
for (int i=0;i<numberOfColumns;i++)
UIView* square = [[UIView alloc] initWithFrame:CGRectMake((i*x), (j*y), x, y)];
[self addSubview:square];
【讨论】:
以上是关于从单个方法实例化一定数量的唯一对象的主要内容,如果未能解决你的问题,请参考以下文章