Iphone 活动指示器行为不符合预期

Iphone 活动指示器行为不符合预期,iphone,ios,objective-c,xcode,uiactivityindicatorview,Iphone,Ios,Objective C,Xcode,Uiactivityindicatorview,我有一个表格视图,列出了美国的所有州。当用户单击某个状态时,web服务调用将生成该状态的河流水位计列表。该列表在另一个表视图控制器中呈现。我正在集成一个活动指示器,以通知用户存在网络活动 我有一个对象(GuageList),它将仪表列表作为可变数组保存。正是这个对象进行web服务调用并填充数组。然后将该数组用作生成的表视图控制器中的数据源。我集成活动指示器的第一次尝试是将此对象的初始化放在显示状态仪表的目标表视图控制器中。然而,当我这样做时,我并没有得到预期的结果。单击状态时,会出现长时间的暂停

我有一个表格视图,列出了美国的所有州。当用户单击某个状态时,web服务调用将生成该状态的河流水位计列表。该列表在另一个表视图控制器中呈现。我正在集成一个活动指示器,以通知用户存在网络活动

我有一个对象(GuageList),它将仪表列表作为可变数组保存。正是这个对象进行web服务调用并填充数组。然后将该数组用作生成的表视图控制器中的数据源。我集成活动指示器的第一次尝试是将此对象的初始化放在显示状态仪表的目标表视图控制器中。然而,当我这样做时,我并没有得到预期的结果。单击状态时,会出现长时间的暂停,然后显示包含仪表列表的表视图,并在目标控制器中短暂呈现活动指示器

接下来,我尝试将GaugeList对象的初始化放置在初始表视图控制器(包含US状态)中。我的想法是初始化那里的高度计对象,并将其传递给segue。这产生了相同的结果

源代码:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if([segue.identifier isEqualToString:@"sgShowStateRivers"]){

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Loading Rivers\nPlease wait..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
        [alert setOpaque:NO];
        [alert show];
        UIActivityIndicatorView *activityStatus = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(120, 230, 50, 50)];
        activityStatus.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 50);
        [activityStatus startAnimating];
        [alert addSubview:activityStatus];

        RiversByStateTableViewController *riversVC = [segue destinationViewController];
        NSIndexPath *path = [self.tableView indexPathForSelectedRow];
        NSArray *tempArray = (NSArray*)[groupedStates objectAtIndex:path.section];
        NSString *key = [tempArray objectAtIndex:path.row];

        NSString *stateID = [statesDict objectForKey:key];
        [riversVC setStateIdentifier:stateID];

        GaugeList *stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateID andType:nil];
        [riversVC setStateGauges:stateGauges];

        [activityStatus stopAnimating];
        [alert dismissWithClickedButtonIndex:0 animated:YES];
    }
}
在我的目的地中,我只需使用stateguages对象来填充表。我的想法是stateguages对象将在segue完成之前填充,但显然我是错误的

我做错了什么


谢谢!V

通常,您会使用
prepareforsgue
delegate方法用运行时内存中已有的数据填充
nextViewController
。这只是在segue实际发生和向用户呈现下一个视图之前的初始步骤。行动应该相对迅速

我想您可能在下载时挂起了主线程,但这基本上不允许您更新视图。我假设您正在进行异步web调用

您可以这样想
[view willDisplay]
[view didDisplay]

如果需要进行web调用来填充数据,则可能需要在用户按下状态(单元格、标签等)时执行此操作。显示视图以显示下载活动。然后,在web调用完成并验证数据后,使用
[self-performsguewithidentifier:@“SegueName”sender:someobject]手动调用segue转换


希望能有帮助

我可以理解您显式调用segue的意义,但是,当我这样做时,我得到以下消息:在意外状态下完成导航转换。导航栏子视图树可能已损坏。当从DIDSELECTROWATINDEXPATH调用segue时会发生这种情况。在单击源中的单元格时,有没有办法强制导航加载目标视图控制器?然后加载数据,同时显示一个活动指示器?这里的问题是在DidSelectRowatineXpath之前调用prepareForSegue。我想您可以一起删除顺序机制。您可以通过编程方式创建ViewController,填充数据,然后在导航堆栈上推送下一个ViewController。