Как обновить DetailView с помощью шаблона приложения MasterDetail

Я новичок в использовании разделенного представления для создания приложений для iPad. Когда я впервые создаю проект, просто используя стандартный шаблон приложения MasterDetail (Xcode 4.2), он создает MasterViewController и DetailViewController. Шаблон имеет следующий метод, который вызывается, когда строка выбирается из таблицы popover (контроллер представления подробных сведений):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

if (!self.detailViewController) 
{
    self.detailViewController = [[DetailViewController alloc]        initWithNibName:@"DetailViewController" bundle:nil]; 
}
[self.navigationController pushViewController:self.detailViewController animated:YES];

Теперь я понимаю, что когда вы используете обычный контроллер навигации, если вы программируете iPhone, вы просто делаете это, чтобы нажать на другой контроллер представления на стек. Однако с помощью этого шаблона он просто подталкивает подробный вид к popover, а не обновляет то, что уже присутствует. Я смущен как то, что мне нужно обновить, чтобы выбрать что-то из всплывающего окна (представление главной детали), а затем обновить detailView.

Update:

Чтобы попытаться проверить "detailItem", который уже настроен для вас в DetailViewController, я прокомментировал pushViewController и добавил следующее:

//[self.navigationController pushViewController:self.detailViewController animated:YES];
self.detailViewController.detailItem = @"Test";

// setter in detailViewController
- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;

        // Update the view.
        [self configureView];
    }

    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    }        
}

- (void)configureView
{
    // Update the user interface for the detail item.
    // detailDescriptionLabel.text is a IBOutlet to the label on the detailView
    if (self.detailItem) {
        self.detailDescriptionLabel.text = [self.detailItem description];
    }
}

В соответствии с этим кодом текст метки на detailViewController должен быть обновлен. Однако, когда я нажимаю на элемент в таблице контроллера главного представления, ничего не происходит.

Ответ 1

Есть несколько способов, которыми вы могли бы это сделать. Прежде всего, как вы сказали, удалите вызов pushViewController (я не знаю, почему шаблон Apple делает это... может быть, просто чтобы показать вам, что вы можете?).

Далее, пусть ваш MasterViewController узнает о DetailViewController, который уже отображается. Обычно я устанавливаю master.detailViewController = detailViewController в appDelegate.

Помните, что DetailViewController уже отображается, поэтому вам не всегда нужно перераспределять его (если вы не заменяете его каким-либо другим видом)

Первый вариант

Используйте вызовы делегатов для установки информации. Объявите протокол для передачи информации в detailView и отобразите его соответствующим образом. Здесь - это учебник, описывающий это более подробно.

Второй вариант

Пройдите DetailViewController некоторых данных и переопределите setter, чтобы обновить detailView. Здесь - это учебник, описывающий это более подробно.

// in DetailViewController    
- (void)setDetailItem:(id)newDetailItem {
        if (detailItem != newDetailItem) {
            [detailItem release];
            detailItem = [newDetailItem retain];

            // Update the view.
            navigationBar.topItem.title = detailItem;
        NSString * imageName = [NSString stringWithFormat:@"%@.png",detailItem];
        [self.fruitImageView setImage:[UIImage imageNamed:imageName]];
        }
    }

Изменить. Просто просмотрите шаблон снова, а код типа setDetailItem уже существует, но код создает совершенно новый detailView, поэтому detailView, который можно просмотреть на splitViewController, не является изменено вообще.