如何从NSArray中的每个项目每秒都有一个UILabel更改文本然后再次旋转?

时间:2017-09-21 19:52:00

标签: ios objective-c uilabel

我希望我的UILabel每秒更改一次文本(更改时淡入和淡出)对于我的数组中的每个项目,然后在最后再次通过它。我试过了:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:YES];
    NSArray *arrayOfText = @[@"Test1",@"Test2",@"Test3",@"Test4"];

    for (int i = 0; i < [arrayOfText count]; i++) {

        [NSThread sleepForTimeInterval:2.0f];

        self.changingTextLabel.text = [arrayOfText objectAtIndex:i];

    }


}

这会加载ViewController,大约8秒后将文本更改为数组中的最后一项。

我做错了什么?有一个更好的方法吗?过去几天我找了一个解决方案,没有什么对我有用。谢谢!

1 个答案:

答案 0 :(得分:2)

永远不要睡在主队列上。它会阻止您应用的用户界面。

您有几个选择,但使用NSTimer可能是最简单的。

向您的班级添加几个实例变量:

@implementation WhateverViewController {
    NSTimer *_labelTimer;
    NSInteger labelIndex = 0;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:YES];

    NSArray *arrayOfText = @[@"Test1",@"Test2",@"Test3",@"Test4"];

    // Setup a timer to run every 2 seconds and update the label
    // Increment the labelIndex so the next label is shown next time
    _labelTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 repeats:YES block:^(NSTimer *timer) {
        self.changingTextLabel.text = arrayOfText[labelIndex];
        labelIndex = (labelIndex + 1) % arrayOfText.count;
    }];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    // Stop the timer when we leave
    [_labelTimer invalidate];
    _labelTimer = nil;
}

- (void)dealloc {
    // Make sure it is stopped
    [_labelTimer invalidate];
}