#objective-c #ios #xcode #uisplitviewcontroller #xcode-template
#objective-c #iOS #xcode — код #uisplitviewcontroller #xcode-шаблон #xcode
Вопрос:
Я новичок в использовании разделенного представления для создания приложений для 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:
Есть несколько разных способов, которыми вы могли бы это сделать. Во-первых, как вы сказали, удалите 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, вообще не изменяется.
Комментарии:
1. Что вы имеете в виду под созданием другого DetailView в отличие от «реального» DetailView?
2. Извините за двусмысленность. Под «реальным» я подразумевал тот, который определен в AppDelegate и добавлен в splitViewController (то есть тот, который фактически доступен для просмотра с правой стороны в альбомной ориентации и в полноэкранном режиме в портретной ориентации). В шаблоне они создают совершенно новый и добавляют его в контроллер навигации.
3. Просто любопытно, по какой причине создается эта новая страница сведений? Я имею в виду, если этот «новый» объект DetailViewController создается, изменяется, но не помещается в стек, какую цель он имеет? На данный момент я создал свойство «DetailViewController» в классе AppDelegate и только что получил доступ к свойству AppDelegate.DetailViewController для обновления. Мне интересно, правильно ли это…
4. На данный момент его действительно нет. Единственная причина, по которой я могу думать, что Apple включила его, заключалась в том, чтобы показать вам, что вы можете помещать представления
UIPopOver
в стек навигации. Ваше решение в порядке, мне нравится немного более чистый код, поскольку в корне есть ссылка на DetailView (master?) посмотреть, но идея та же. Если это работает для вас, придерживайтесь его.5. Я не уверен, что вы имеете в виду, говоря о наличии ссылки на DetailView в корне (Master). Предоставьте свойство, которое ссылается на объект DetailViewController в классе MasterViewController?