iOS: Как динамически изменять DetailView в шаблоне SplitView?

#objective-c #ios #uisplitviewcontroller

#objective-c #iOS #uisplitviewcontroller

Вопрос:

У меня есть проект шаблона SplitView. Я хочу изменить DetailView при выборе пользователем элемента в RootViewController.

На самом деле я не могу просто изменить то, что находится внутри этого представления (DetailView), как это делается в шаблоне (когда вы устанавливаете флажок «использовать хранилище основных данных» при создании проекта). Я хочу переключаться между целыми представлениями.

Я пробовал это:

 AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.detailViewController setView:curretnDetailViewController.view];
appDelegate.detailViewController = currentDetailViewController;
  

Кстати, я не понимаю, зачем мне нужна строка # 2 (..setView: ..)? Почему назначения DetailViewController (строка # 3) недостаточно? — Код выглядит ужасно = (

Но в любом случае это работает не совсем так, как я хочу. Все, кроме DetailView, исчезает. Как будто я изменил основной вид, а не только DetailViewController

Я думаю, я должен что-то изменить в splitViewController, но не выяснил, что = (

Спасибо за ваше внимание.

Ответ №1:

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

Во-первых, знаете ли вы, что у Apple есть пример просмотра с несколькими деталями? Вот примеры Apple

Вы должны понимать, что такое splitviewcontroller, чтобы получить представление о том, что делает Apple. Думайте о контроллере splitview как о контейнере в окне вашего устройства. Этот контейнер имеет 2 отделения, тонкую левую сторону и большую правую сторону. Теперь, чтобы изменить любую сторону, вы должны заменить этот раздел другим разделом аналогичного размера и характера. Вы не можете поместить туда отсек, который не подходит или который делает что-то необычное, потому что он просто не поместится.

В техническом обсуждении найдите приведенный ниже код в примере. Контроллер splitview имеет массив из 2 представлений, и вы можете изменять представления в этом массиве. Таким образом, в этом массиве есть 2 вида, левый называется navigationcontroller, а правый — detailviewcontroller. Если вы выделите и инициируете представление и добавите его к любому из этих двух, то это представление заменит текущее представление в splitviewcontroller.

 NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
  

Теперь перейдем ко второй части вашего вопроса — я думаю, что с левой стороны вы хотите всегда иметь возможность выбирать что-то и иметь возможность изменять правую руку side….am Я прав?

Я прочитал три разных способа сделать это и не видел никого, кто сказал бы, что один лучше другого.

  1. настройте уведомление, при котором при нажатии на что-либо слева уведомление отправляется в правую часть.
  2. когда вы начинаете с нижнего или корневого представления левой стороны, у вас будет ссылка на правую сторону, если вы добавляете подвиды и т.д. В левую сторону, вы всегда передаете ссылку на правую сторону.
  3. Способ, которым я это сделал, заключался в настройке протокола в appdelegate или в делегате rootview, затем в представлении, с которым я хочу поговорить, с правой стороны, он использует этот протокол, и моя правая сторона реализует этот протокол. Это последнее, что я изучил, поскольку это предпочтительный метод получения модальных представлений для взаимодействия с другими представлениями.

Я не эксперт, поэтому я не добавил код для каждого из трех вариантов выше, я предлагаю вам немного поискать темы в Google, и вы увидите примеры. Если вы действительно застряли на одном, дайте мне знать, и я попытаюсь снова найти в Google примеры, которые я находил в прошлом. Наименее сложным, я думаю, является № 1.

Я надеюсь, что это поможет вам двигаться в правильном направлении.

Комментарии:

1. Есть ли шанс, что у вас все еще есть пример третьего метода, который вы перечислили выше?