Как обновить DetailView с помощью шаблона приложения MasterDetail - PullRequest
11 голосов
/ 28 октября 2011

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

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

8 голосов
/ 28 октября 2011

Есть несколько разных способов сделать это. Прежде всего, как вы сказали, удалите вызов 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]];
        }
    }

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

...