从单个方法实例化一定数量的唯一对象

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];
    

【讨论】:

以上是关于从单个方法实例化一定数量的唯一对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QJSEngine 实例化 c++ 对象

在 Unity 中沿光线投射实例化预定义数量的对象

我们可以在AppDelegate中实例化核心数据的单个对象并在整个应用程序中使用它吗?

仅实例化一个类的唯一对象

Java_接口实例化对象 (待续)

设计模式:单例模式