活动指标行为与预期不符

时间:2013-10-13 17:06:23

标签: iphone ios objective-c xcode uiactivityindicatorview

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

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

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

来源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对象来填充表格。我的想法是,在segue完成之前,stateGauges对象会填充,但显然我不正确。

我做错了什么?

谢谢! V

1 个答案:

答案 0 :(得分:0)

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

我认为您在下载时可能会占用主线程,但这基本上不允许您更新视图。我假设您正在进行异步Web调用。

您可以将此视为[view willDisplay][view didDisplay]

如果您需要进行Web调用以填充数据,则可能需要在用户按下State(单元格,标签等)时执行此操作。显示视图以显示下载活动。然后,在完成网络通话并验证数据后,使用[self performSegueWithIdentifier:@"SegueName" sender:someobject];

自行手动调用segue转换

希望它有所帮助。