在循环中动态添加UILabels

时间:2013-10-07 08:28:06

标签: iphone ios objective-c

我正在寻找一个函数或循环原型来将UILabel添加到iPhone上的视图中。原因是我不知道需要添加多少标签,因此需要动态添加。

我的伪代码如下。我们的想法是每个标签都有一个字符串,然后放在下一个屏幕上,因此是+ self.view.frame.size.width语句。分页等工作完美,问题是所有标签似乎都在第二个屏幕上结束,即标签3出现在标签2的顶部。问题似乎是我总是引用altLabel,因此一旦我移动到第二个位置,我不断地参考那个位置,并且永远不会移动到那里。

我可以使用'count'变量来增加屏幕宽度,但如果我这样做,每次更新标签文本时,它都会覆盖前一个。

int count = 0;
int maxNumber = 10;

    while(count < maxNumber) {
    //Add a label
        UILabel *altlabel; //Declare the label

        if (count > 0) {
            //Move the label
             altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(altlabel.frame)+self.view.frame.size.width,10,300,25)];
            altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];
        }

        else {
             altlabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,300,25)];
            altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class];
        }


    altlabel.textColor = [UIColor greenColor];
    [altlabel sizeToFit];
    [_scrollView addSubview:altlabel];
        count++;
    }

4 个答案:

答案 0 :(得分:1)

问题在于这一行:

UILabel *altlabel; // Declare the label

if (count > 0) {
    //Move the label
    altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(altlabel.frame)+self.view.frame.size.width,10,300,25)];
    altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];
}

您正在使用 altlabel.frame 设置框架,但未设置 altlabel :您使用 UILabel * altlabel在第一行重新声明了它

使用此代码,每个标签但第一个标签将具有相同的框架。试试这个:

int count = 0;
int maxNumber = 10;

CGRect rect;

while(count < maxNumber) {
    // Add a label
    UILabel *altlabel; // Declare the label

    if (count > 0) {
        //Move the label
        altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(rect.frame)+self.view.frame.size.width*count, 10, 300, 25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];

    } else {
        altlabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class];
    }

    rect = altlabel.frame;

    altlabel.textColor = [UIColor greenColor];
    [altlabel sizeToFit];
    [_scrollView addSubview:altlabel];
    count++;
}

现在新标签的框架保存在临时var(CGRect框架)中,您可以使用它。

答案 1 :(得分:0)

此代码应该有效:

int count = 0; int maxNumber = 10;

while(count < maxNumber) {
//Add a label
    UILabel *altlabel; //Declare the label

    if (count > 0) {
        //Move the label
         altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(altlabel.frame)+(self.view.frame.size.width*count),10,300,25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];
    }

    else {

         altlabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,300,25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class];
    }


altlabel.textColor = [UIColor greenColor];
[altlabel sizeToFit];
[_scrollView addSubview:altlabel];
    count++;
}

答案 2 :(得分:0)

更清晰的方法是在创建之前预先确定标签的框架,然后将其添加为子视图(或者将每个标签保存到数组中以供稍后参考)。

NSInteger numberOfLabels = 10;
CGFloat labelHeight = 25.0;
CGFloat padding = 10.0;

for(NSInteger index = 0; index < numberOfLabels; ++index)
{
    CGRect frame = CGRectMake(10.0, (index * (labelHeight + padding)), 300.0, labelHeight);

    UILabel *label = [[UILabel alloc] initWithFrame:frame];

    [[self view] addSubview:label];
}

您可能希望为标签分配setTag:标签以引用每个标签,或者从数组中收集,而不是循环遍历子视图以在创建文本后收集或附加文本。

答案 3 :(得分:0)

我认为问题在于每次循环运行时都会重新初始化标签'altLabel',因此标签的框架也会重置。

这意味着每次创建新标签时,框架都将位于完全相同的位置。 解决这个问题的一种简单方法就是将标签的初始声明移到while循环之外。

可能更好,更有效的修复需要重新使用所使用的循环。当我做这样的事情时,我倾向于使用for循环,因为你使用索引来帮助定位事物:

for(int i = 0; i < 10; i++)
{
  //Getting the x-position correct here may take a little trial and error
  UILabel *altLabel = [[UILabel alloc] initWithFrame:CGRectMake(INSET + i*LABEL_WIDTH, 10, 300, 25)];
  [altLabel setText:[NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count]];
  [altLabel setTextColor:[UIColor greenColor]];
  [altLabel sizeToFit];
  [_scrollView addSubview:altLabel];
}

这应该意味着你不需要柜台。

希望这有帮助!

马特