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

#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?