Поведение индикатора активности не соответствует ожидаемому

У меня есть табличное представление, в котором перечислены все штаты США. Когда пользователь щелкает штат, из вызова веб-службы создается список речных постов для этого штата. Список отображается в другом контроллере табличного представления. Я нахожусь в процессе интеграции индикатора активности, чтобы уведомить пользователя о сетевой активности.

У меня есть объект (GuageList), который содержит список датчиков в виде изменяемого массива. Именно этот объект вызывает веб-службу и заполняет массив. Затем массив используется в качестве источника данных в результирующем контроллере табличного представления. Моя первая попытка интегрировать индикатор активности заключалась в том, чтобы поместить инициализацию этого объекта в целевой контроллер табличного представления, который отображает датчики для состояния. Однако, когда я это делаю, я не получаю ожидаемых результатов. При нажатии на состояние возникает длительная пауза, затем отображается табличное представление, содержащее список датчиков, с кратковременным отображением индикатора активности в целевом контроллере.

Затем я попытался разместить инициализацию объекта GaugeList в начальном контроллере табличного представления (содержащем штаты США). Мои мысли состояли в том, чтобы инициализировать объект GaugeList там и передать его в переходе. Это дало идентичные результаты.

Исходный код перехода:

-(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 будет заполнен до завершения перехода, но, видимо, я ошибаюсь.

Что я делаю неправильно?

Спасибо! В


person Community    schedule 13.10.2013    source источник


Ответы (1)


Обычно вы используете метод делегата prepareForSegue для заполнения nextViewController данными, которые у вас уже есть в оперативной памяти. Это всего лишь начальный шаг перед тем, как действительно произойдет переход, и пользователю будет представлено следующее представление. Действия должны быть относительно быстрыми.

Я предполагаю, что вы можете задерживать основной поток во время загрузки, но это, по сути, не позволит вам обновлять представления. Я предполагаю, что вы совершаете асинхронные веб-вызовы.

Вы можете думать об этом как о [view willDisplay] и [view didDisplay].

Если вам нужно сделать веб-вызов для заполнения ваших данных, вы можете выполнить это действие, когда пользователь нажимает состояние (ячейка, метка и т. д.). Представьте представление, чтобы показать активность загрузки. Затем, после завершения веб-вызова и проверки данных, вручную вызовите переход segue, используя [self performSegueWithIdentifier:@"SegueName" sender:someobject];

Надеюсь, поможет.

person some programmer    schedule 13.10.2013
comment
Я могу понять вашу точку зрения на явный вызов перехода, однако, когда я это делаю, я получаю следующее сообщение: Завершение перехода навигации в неожиданном состоянии. Дерево подпредставления панели навигации может быть повреждено. Это происходит при вызове перехода из didSelectRowAtIndexPath - person ; 13.10.2013
comment
Будет ли какой-либо способ заставить навигацию загружать контроллер представления назначения при нажатии на ячейку в источнике? Затем загрузить данные, показывая индикатор активности? - person ; 13.10.2013
comment
Проблема здесь в том, что prepareForSegue вызывается до didSelectRowAtIndexPath. - person ; 13.10.2013
comment
Я полагаю, вы могли бы полностью удалить механизм секвенирования. Вы можете просто создать ViewController программно, заполнить данные, а затем поместить следующий ViewController в стек навигации. - person some programmer; 13.10.2013