Как обновить 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 ответ:
Есть несколько различных способов, которыми вы могли бы это сделать. Во-первых, как вы сказали, удалите вызов
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, не изменяется вообще.