[ios]无法获取 UIActivityIndicator 露面时调用 pushViewController 在 didSelectRowAtIndexPath

标签: Xcode ios
发布时间: 2017/3/27 19:27:02
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这里是我的代码...

- (void) threadStartAnimating {
    [activityIndicator startAnimating];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    activityIndicator=[[UIActivityIndicatorView alloc] init];
    [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityIndicator.center=[self tableView].center;
    [[self tableView] addSubview:activityIndicator];

    [NSThread detachNewThreadSelector:@selector(threadStartAnimating) toTarget:self withObject:nil];
    EventController *eventController = [[EventController alloc] init];
    [eventController setEventID:[[lineItems objectAtIndex:[indexPath row]] objectForKey:@"view_event_button_param"]];
    [activityIndicator stopAnimating];
    [[self navigationController] pushViewController:eventController animated:YES];
}

事件控制器包含几秒钟加载的 web 服务。我能得到activity指示符来显示的唯一方法是如果我把一个无限循环扔在那里......发现了很多提到把它放在一个单独的线程中的例子,但这似乎并不工作。

解决方法 1:

你的问题是,如果你要数据 viewDidLoad 然后之后加载此视图,通常在第一次显示该视图控制器的过程中,不会直到调用该方法。你的情况,这是在 pushViewController:animated: 调用。

所以一种方式做你想要什么可能是交换围绕以下两行︰

[activityIndicator stopAnimating];
[[self navigationController] pushViewController:eventController animated:YES];

但是,老实说,我将创建一个名为Protocol EventControllerDelegate ,有弱引用属性设置为 id <EventControllerDelegate> 在你 EventController ,然后设置创建的视图控制器 EventController 作为委托之前你推它。然后在委托中定义的方法和在您的视图控制器中实现它,在该方法中停止微调控制项。然后在 EventController ,当你完成加载您的数据,调用委托方法。

编辑︰ 如果你真的想要没有定义一个委托,你可以尝试改变你的代码像这样一些事情︰

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    activityIndicator=[[UIActivityIndicatorView alloc] init];
    [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
    activityIndicator.center=[self tableView].center;
    [[self tableView] addSubview:activityIndicator];

    EventController *eventController = [[EventController alloc] init];
    [eventController setEventID:[[lineItems objectAtIndex:[indexPath row]] objectForKey:@"view_event_button_param"]];

    [activityIndicator startAnimating];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIView *v = eventController.view;

        dispatch_async(dispatch_get_main_queue(), ^{
            [activityIndicator stopAnimating];
            [[self navigationController] pushViewController:eventController animated:YES];
        });
    });
}

它使用最大公因数的清晰度和平常"访问视图属性,迫使 loadView / viewDidLoad "破解。

赞助商