0

我想构建对象,然后用它打开一个控制器。构建最多可能需要 5 秒,我想在它处理时显示一条消息。
我有以下实现didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    messageView.hidden = NO;

    // Some methods

    Controller *ctrl = [Controller new];
    [self.navigationController pushViewController:ctrl animated:YES];
}

一切都很好,但有一个问题:messageView仅在推送动画开始时出现。我能做些什么来解决这个问题?

4

5 回答 5

1

它没有显示,因为您在构建对象时阻塞了主线程。

在您将控制权返回给运行循环之前,用户界面不会更新。

解决方案是在后台线程上构建对象,最简单的方法是使用 libdispatch,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    messageView.hidden = NO;

    // you may want to disable user interaction while background operations happen

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

        // Perform your lengthy operations here

        Controller *ctrl = [[Controller alloc] init];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.navigationController pushViewController:ctrl animated:YES];
        }
    });
}
于 2012-07-02T20:20:25.423 回答
1

与乔纳森的回答类似,稍微延迟推送以使 messageView 有时间出现。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    messageView.hidden = NO;

    int64_t oneMillisecond = NSEC_PER_MSEC;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, oneMillisecond), dispatch_get_main_queue(), ^(void){
        // Some methods

        Controller *ctrl = [Controller new];
        [self.navigationController pushViewController:ctrl animated:YES];
    });
}
于 2012-07-02T20:23:09.403 回答
0

如果你想要一个UIAlertView你可以使用这个代码:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title..." message:@"More?" delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
    [alert show];

完成后,您可以调用它来关闭:

[alert dismissWithClickedButtonIndex:0 animated:YES];
于 2012-07-02T19:53:47.497 回答
0

你可以试试这个:

[UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationCurveLinear animations:^(void)
{
    messageView.hidden = NO;
}
completion:^(BOOL finished)
{
    Controller *ctrl = [Controller new];
    [self.navigationController pushViewController:ctrl animated:YES];
}];
于 2012-07-02T20:11:03.453 回答
0

在您的 didSelectRowAtIndexPath 调用期间,视图可能不会重绘。

所以...我会尝试在一个块中运行长时间运行的方法。然后用你的 messageView 动画阻止主线程,并让你的块发布通知或关闭它的东西。

您可能需要某种条件让 messageView 在一段时间后自行关闭。

于 2012-07-02T20:21:00.437 回答