0

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

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

接下来,我尝试将 GaugeList 对象的初始化放在初始表视图控制器(包含美国各州)中。我的想法是在那里初始化 GaugeList 对象,并将其传递给 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];
    }
}

在我的目的地,我只是使用 stateGauges 对象来填充表格。我的想法是 stateGauges 对象会在 segue 完成之前填充,但显然我不正确。

我究竟做错了什么?

谢谢!五

4

1 回答 1

0

通常,您将使用prepareForSegue委托方法来填充nextViewController运行时内存中已有的数据。这只是在 segue 实际发生并将下一个视图呈现给用户之前的初始步骤。动作应该相对较快。

我想您可能会在下载时暂停主线程,但这基本上不允许您更新视图。我将假设您正在进行异步网络调用。

你可以把它想象成[view willDisplay][view didDisplay]

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

希望能帮助到你。

于 2013-10-13T17:26:38.207 回答