Повторное использование детального контроллера представления в UISplitViewController - PullRequest
2 голосов
/ 11 мая 2011

В основном, когда я реализую разделенное представление, подобное тому, которое представлено в примере Apple «MultipleDetailsViews», все работает нормально, оно выделяет новое подробное представление каждый раз, когда выбирается строка.Вот соответствующий код из примера:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil;

    if (row == 0) {
        FirstDetailViewController *newDetailViewController = [[FirstDetailViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil];
        detailViewController = newDetailViewController;
    }

    // ...

    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers;

    // ...
}

Но то, что я ищу, - это повторное использование детализированных контроллеров представления, которые лениво выделяют контроллер представления, когда он выбран, и сохраняют ссылку на него вмой объектТаким образом, когда выбирается другая строка, контроллер представления не освобождается, а при повторном выборе он будет использоваться повторно вместо выделения новой.Вот соответствующий код:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil;

    if (row == 0) {
        if (self.firstDetailViewController == nil) {
           FirstDetailViewController *newDetailViewController = [[FirstDetailViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil];
           self.firstDetailViewController = newDetailViewController;
           [newDetailViewController release];
        }
        detailViewController = self.firstDetailViewController;
    }

    // ...

    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers;

    // ...
}

self.firstDetailViewController запускается при первом выборе первой строки, а затем используется повторно.

Когда я это делаю, это хорошо работает в альбомной ориентациино в портретном режиме после нескольких щелчков во всплывающем меню возникает исключение: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Popovers cannot be presented from a view which does not have a window.'

Так почему меня это волнует?и почему я не хочу перераспределять контроллеры представления?потому что в некоторых из них я хочу выполнять задачи, которые не будут прерваны (убиты), если пользователь перейдет в новом подробном представлении, пока задача еще не завершена.

Есть ли кто-то с идеейчто происходит или с работающей реализацией того, чего я пытаюсь достичь?

1 Ответ

0 голосов
/ 10 января 2016

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

Если вы это сделаете, однакоЕсли вы хотите поэкспериментировать с повторным использованием контроллера представления, этого можно достичь, установив свойство viewControllers на новом контроллере навигации с предыдущим подробным контроллером, сохраненным в viewDidLoad:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
        UINavigationController* navigationController = (UINavigationController*)[segue destinationViewController];

        // reuse existing controller
        navigationController.viewControllers = @[self.detailViewController];

        // update the detail controller as normal.
        [controller setDetailItem:object];
        controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
        controller.navigationItem.leftItemsSupplementBackButton = YES;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...