UISplitviewController - Замените DetailView во время выполнения из MasterView, не теряя кнопку в портретном режиме - PullRequest
1 голос
/ 17 августа 2011

У меня следующая проблема: Когда я пытаюсь заменить detailView моего UISplitViewController, выбирая элемент в таблице в моем masterView, кнопка навигации для masterView исчезает. Если iPad находится в ландшафтном режиме, замена работает без каких-либо признаков ошибки. Кнопка возвращается, когда я поворачиваю iPad сначала в ландшафтный режим, а затем обратно в портретный режим. Итак, я думаю, что я правильно установил делегата для контроллера uisplitview. Есть ли возможность сообщить контроллеру uisplitview, чтобы он попросил делегата обновить кнопку, не поворачивая устройство, или я что-то забыл в то время, когда заменил detailView - вот код для замены в masterViewController

MyViewController *myvc = [[MyViewController alloc] initWithNibName:nil bundle:nil];
[self.subservientController setViewControllers:[NSArray arrayWithObject:myvc] animated:NO];
self.splitViewController.delegate = myvc;

Хозяева subservientController - это ссылка на навигационный контроллер, в который будет помещен detailViewController (MyViewController)

1 Ответ

1 голос
/ 22 июня 2013

Это очень старый вопрос, и было много других вопросов о тех же типах вещей, поэтому я был удивлен, увидев этот вопрос без ответа.Не уверен, что вам все еще нужен ответ, но для всех, кто находит это в поиске, я надеюсь, что это поможет.

Здесь меня смутило то, что когда вы говорите «кнопка навигации для masterView»исчезает ", это действительно только кажетсяЧто действительно происходит, так это то, что в вашем новом взгляде его еще никогда не существовало, а вы просто заменили старое представление.Вы даже упоминаете об этом в вопросе, что вы заменили подробный вид.Это заставило меня задуматься, когда я посмотрел на файлы, сгенерированные из шаблона приложения Master-Detail, из которого я изначально создал свое приложение, которое назначило UISplitViewConrollerDelegate для представления сведений.

Поэтому, когда вы или я заменяем подробный вид с новым видом, мы также просто стерли UISplitViewConrollerDelegate, поэтому мне нужно было убедиться, что новый подробный вид также действует как UISplitViewConrollerDelegate, что создало другие проблемы для отслеживания popoverButtonItemон хранится в iVar.

В справочнике по классам UISplitViewController написано:

Существует два основных подхода, которые можно использовать в зависимости от типасоздаваемого приложения:

Простой интерфейс мастер-детали, в котором вид детали остается постоянным.В этой конфигурации один контроллер представления управляет подробным представлением в течение всего жизненного цикла приложения и обновляет содержимое подпредставлений, чтобы отразить выбор в главном представлении.Главный контроллер вида имеет ссылку на контроллер подробного вида и информирует контроллер подробного вида всякий раз, когда выбранный элемент изменяется или происходит какое-либо другое соответствующее событие.Контроллер подробного представления может также служить делегатом контроллера разделенного представления.

Сложное приложение, в котором могут меняться главное и подробное представления (и соответствующие контроллеры представления).В сложных конфигурациях вам необходим отдельный пользовательский объект контроллера для управления главным контроллером и контроллерами детального представления и для связи между ними.Пользовательский контроллер, как правило, является делегатом контроллера разделенного представления и отвечает за связь с текущим контроллером подробного представления, чтобы показать и скрыть элемент кнопки всплывающей панели.

Второй здесь - это то, что у вас есть, ина самом деле Apple предоставляет пример приложения под названием MultipleDetailViews , которое показывает, как это правильно сделать, что включает в себя размещение делегата вне контроллеров подробного представления и соответствие каждого из этих контроллеров подробного представления как минимум двум протоколам.Способы один: добавить мастер-кнопку, а второй - удалить мастер-кнопку с панели навигации (при условии, что у вас есть панель навигации в подробном представлении).

Обратите внимание, что «кнопка навигации для masterView» всегда должна бытьотображается и скрывается в подробном представлении (и каждом из них, если у вас их больше одного), потому что главное представление - это то, которое будет скрыто время от времени.Это было еще одной вещью, которая продолжала сбивать меня с толку, потому что я продолжал думать, что он принадлежит контроллеру основного вида.

Я предполагаю, что вы, возможно, уже все это сработали, но это помогает объяснить фактический ответваш вопрос.


Ваш новый контроллер подробного просмотра должен проверить, отображается ли ваше изображение в UISplitView, представленном в книжной ориентации, и, если да, представить кнопку.


Просто сделайте это в - (void) viewWillAppear: (BOOL) анимированном методе и отобразите его при необходимости.Это также означает, что вы должны либо отслеживать последнюю скрытую кнопку, либо создавать новую.

Надеюсь, это поможет, и если кто-то читает эту логику неправильно, поправьте меня.Это все еще сбивает меня с толку каждый раз, когда я обнаруживаю, что эта кнопка отсутствует в моем приложении.

...