Objective c iPhone应用程序的标签显示不是即时的

Objective c iPhone应用程序的标签显示不是即时的,objective-c,ios4,animation,uilabel,Objective C,Ios4,Animation,Uilabel,我正在为iPhone开发一个应用程序。我的问题是如何每隔0.5秒显示一个带有不同文本的新标签。例如,它将显示蓝色、红色、绿色、橙色和紫色;一个接一个。现在,我正在这样做: results = aDictionary; NSArray *myKeys = [results allKeys]; NSArray *sortedKeys = [myKey sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

我正在为iPhone开发一个应用程序。我的问题是如何每隔0.5秒显示一个带有不同文本的新标签。例如,它将显示蓝色、红色、绿色、橙色和紫色;一个接一个。现在,我正在这样做:

    results = aDictionary;
    NSArray *myKeys = [results allKeys];
    NSArray *sortedKeys = [myKey sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
    int keyCount = [sortedKeys count];
    while (flag == NO) {


        NSTimeInterval timeMS = [startDate timeIntervalSinceNow] * -10000.0;            

        if (timeMS >= i) {
            ii++;
            i += 1000;
            NSLog(@"endDate = %f", timeMS);
            int randomNumber = rand() % keyCount  + 1;
            lblResult.text = [results valueForKey:[sortedKeys objectAtIndex:(randomNumber - 1)]];
            result = [results valueForKey:[sortedKeys objectAtIndex:(randomNumber - 1)]];
            lblResult.text = result;

       }
        if (ii > 25) {
            flag = YES;
        }
    }
    lblResult.text = [results valueForKey:[sortedKeys objectAtIndex:(sortedKeys.count - 1)]];

此函数在ViewDidDisplay函数中调用,当前不显示新标签。它只显示末尾的一个。我做错什么了吗?最好的方法是什么

问题在于,您没有给运行循环一个运行的机会(因此,无法进行绘图)。您需要使用一个定期触发并设置下一个文本的
NSTimer
(您可以在实例变量中记住您当前所在的位置)

或者使用类似的方法(假设项目是一个保存字符串的
NSArray
):

以触发初始更新

当然,您需要确保视图消失时执行不会继续,您可以通过取消performSelector来执行,或者如果您使用的是计时器,只需将其无效,或者使用布尔值,或者

如果你真的想变得更花哨,可以使用GCD:)

和的可能副本
- (void)updateText:(NSNumber *)num
{
    NSUInteger index = [num unsignedInteger];
    [label setText:[items objectAtIndex:index]];
    index++;

    // to loop, add
    // if (index == [items count]) { index = 0; }

    if (index < [items count]) {
        [self performSelector:@selector(updateText:) withObject:[NSNumber numberWithUnsignedInteger:index] afterDelay:0.5];
    }
}
[self updateText:[NSNumber numberWithUnsignedInteger:0]];