IOS按钮点击并更新视图

时间:2011-10-25 02:05:16

标签: ios events uibutton

在buttonClicked方法中,我想将UILabel中文本的颜色设置为黑色,等待三秒钟,然后将颜色设置为绿色。但是,标签永远不会变黑。该方法等待三秒钟,然后UILabel文本变为绿色。我认为使用performSelectorOnMainThread会解决这个问题,但事实并非如此。代码如下。非常感谢,如果我遗漏了一些明显的东西,请道歉。

Jon R。

-(void) buttonClicked: (id) sender
{
    // (UILabel *) letterLabel is instance variable of TestProgramDelegate

    [letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES];

    [NSThread sleepForTimeInterval:3];

    [letterLabel performSelectorOnMainThread:@selector(setTextColor:) withObject: [UIColor greenColor] waitUntilDone:YES];
}

2 个答案:

答案 0 :(得分:2)

您的方法是同步更改颜色两次。所有代码都在主线程上执行。

// run on main thread
[letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES];

// buttonClicked: called on mainThread so this is on main thread
[NSThread sleepForTimeInterval:3];

// also on main thread ...
[letterLabel performSelectorOnMainThread:@selector(setTextColor:) withObject: [UIColor greenColor] waitUntilDone:YES];

UI主线程正在循环,并根据按钮点击等内容查找要触发的代码。检测到点击后,您的方法将执行,设置颜色,等待三秒钟,然后在UI主循环重绘之前再次设置颜色。由于UI之间没有重绘,因此您永远不会看到第一个。

如果你想这样做,你需要在后台线程上设置颜色,等待三秒钟,然后回调主线程来更新UI。

这是相关的帖子:

GCD, Threads, Program Flow and UI Updating

答案 1 :(得分:0)

将在主线程上调用- (void)buttonClicked:(id)sender,因此当上下文已经是主线程时,为什么使用[letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES];会让人感到困惑。

[letterlabel setBackgroundColor:[UIColor blackColor]];应该是按下按钮时需要调用的全部内容。

您可以使用NSTimer或本地通知回调将颜色更改为绿色。将主线程放入应用程序中通常不是一个好主意。

希望有所帮助!