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


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

- (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, вы просто сделайте это, чтобы подтолкнуть другой контроллер вида к стеку. Однако, с помощью этого шаблона, он просто толкает детальное представление на поповер, а не обновляет то, что уже присутствует. Я запутался, как то, что мне нужно обновить, чтобы выбрать что-то из pop over (master detail view), а затем обновить detailView.

Обновление:

Чтобы попробовать и протестировать "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 11

1 ответ:

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

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

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

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

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

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

Передайте DetailViewController некоторые данные и переопределите сеттер, чтобы обновить 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]];
        }
    }

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