Навигация между контроллерами просмотра? - PullRequest
0 голосов
/ 16 марта 2011

В моем приложении Iphone я пытаюсь перейти от одного контроллера табличного представления к следующему контроллеру табличного представления. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно получить данные с помощью http-запроса, а затем проанализировать эти данные, когда пользователь выбирает ячейку. Я могу получить и проанализировать данные, но контроллер представления не ожидает анализа данных и отображается следующий контроллер представления (который пуст). Как преодолеть эту проблему.

indexSelected = [NSString stringWithFormat: @"%d",[indexPath row] ];

    [[MySingletonClass sharedMySingleton] doAnAuthenticatedAPIFetch_Subscriber_Detail : indexSelected];

    SubscribersDetailViews2 *viewController = [[SubscribersDetailViews2 alloc] initWithNibName:@"SubscribersDetailViews2" bundle:nil];

    [[self navigationController] pushViewController:viewController animated:YES];

    [viewController release];

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Вот что вы делаете:

indexSelected = [NSString stringWithFormat: @"%d",[indexPath row] ];

SubscribersDetailViews2 *viewController = [[SubscribersDetailViews2 alloc] initWithNibName:@"SubscribersDetailViews2" bundle:nil];

[[MySingletonClass sharedMySingleton] doAnAuthenticatedAPIFetch_Subscriber_Detail:indexSelected delegate:self];

[[self navigationController] pushViewController:viewController animated:YES];

[viewController release];

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

Если вам нужна дополнительная информация о том, как это сделать, оставьте комментарий.

РЕДАКТИРОВАТЬ: Так вот, как объявитьи использовать протокол.Я постараюсь сделать это как можно более простым.Я не уверен, что мне нравится ваше соглашение об именах, но я все равно буду использовать его для этого примера.

Итак, давайте перейдем к коду.Вот как вы объявляете протокол:

@protocol MySingletonClassDelegate <NSObject>

@optional
- (void)didDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithData:(NSArray *)data;

- (void)failedToDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithError:(NSError *)error;

@end

Опять же, я не слишком люблю соглашение об именах.Вы не должны иметь подчеркивания в именах методов target-c.

Протокол должен быть определен в MySingletonClass.h до объявления MySingletonClass.

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

Чтобы использовать протокол, вам необходимо следующее:

@interface SubscribersDetailViews2 : UITableViewController <MySingletonClassDelegate>

Вам также нужно реализовать методы, объявленные в протоколе, но я оставлю эту реализацию вам.

Поскольку получение данных уже, кажется, происходит в фоновом режиме, я не думаю, что мне нужнообъяснить, как это сделать.Важно помнить, что вы хотите выполнять методы делегата в главном потоке.Вот код для этого:

- (void)doAnAuthenticatedAPIFetch_Subscriber_Detail:(NSUInteger)index delegate:id<MySingletonClassDelegate>delegate {
    // Fetching data in background
    if (successful) {
        [self performSelectorOnMainThread:@selector(didDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithData:) withObject:data waitUntilDone:NO];
    } else {
        [self performSelectorOnMainThread:@selector(failedToDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithError:) withObject:error waitUntilDone:NO];
    }
}

Просто чтобы прояснить, // Fetching data in background должен быть заменен вашим кодом.Я предполагаю, что ваш код создает переменные (NSArray * data, NSError * error, BOOL успешно), которые я использую.

Вот и все, если вам нужно что-то пояснить, дайте мне знать.

1 голос
/ 16 марта 2011

Есть несколько вариантов:

  1. Кэшируйте данные, то есть делайте их полную копию на устройстве iOS (конечно, это может быть непрактично)
  2. Отображение промежуточного экрана с надписью «загрузка» и переход к «реальному» экрану после загрузки данных
  3. Для вашей таблицы фактически есть два разных источника данных. Первый ваш текущий. Второй будет одна ячейка с надписью "Загрузка ..."

Короче говоря, нет смысла делать это, но нет проблем с загрузкой данных на лету, если вы сообщаете своим пользователям, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...