循环遍历子视图或视图

时间:2011-01-24 05:54:27

标签: iphone objective-c ios4

我做错了什么?观点在IB中设置。 answersView有3个子视图。每个都是UITextViews。但我得到一个答案,我无法在UIView上设置文字。提前谢谢。

int i;
for (i=0; i<[[[self answersView]subviews]count]; i++) 
{
    UITextView *currentText = (UITextView *)[[self answersView] viewWithTag:i];
    NSString *answer = [[self answersArray] objectAtIndex:i];
    [currentText setText:answer];
}

错误是:由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [UIView setText:]:无法识别的选择器发送到实例0x5f56330'

好的,我已经更新了代码

int i;
for (i=0; i<[[[self answersView]subviews]count]; i++) 
{
    UITextView *currentText = (UITextView *)[[self answersView] viewWithTag:i+1];
    if ([currentText isKindOfClass:[UITextView class]]) {
        NSString *answer = [[self answersArray] objectAtIndex:i];
        [currentText setText:answer];
        NSLog(@" tag %d",i + 1);
    }
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您想在for循环中添加-1,这样就不会超出范围。此外,您需要检查子视图是否为文本字段对象,否则您将在其他类型的视图上设置文本。

<强>代码:

for (int i=0; i<[[[self answersView]subviews]count]-1; i++) {
    if ([[[self answersView] viewWithTag:i] isKindOfClass:@"UITextView") {
        UITextView *currentText = (UITextView *)[[self answersView] viewWithTag:i];
        NSString *answer = [[self answersArray] objectAtIndex:i];
        [currentText setText:answer];
    }
}

答案 1 :(得分:1)

嘿那里, 我认为你的代码很容易出错,因为它依赖于视图总是会设置标签号的事实。在我看来,你可以做两件事:

1)在调用setText之前检查currentText是否是一个有效的UITextView:

if ([currentText isKindOfClass:[UITextView class]])
{
   ...
   [currentText setText:answer];
   ...
}

2)我认为它更好,以这种方式遍历子视图:

for (UITextView* currentText in [[self answersView]subViews])
{
   ...
   [currentText setText:answer];
   ...
}

答案 2 :(得分:0)

将标记值设置为大于0.从1循环到数组计数。

超级视图的默认标记值为0.因此只会出现这样的错误。