Подтвердить что ты не робот

Как отобразить новый контроллер представления в том же окне Mac?

Я новичок в разработке Mac и немного смущен новой функцией "раскадровки" в Xcode 6. То, что я пытаюсь сделать, это перейти от одного контроллера представления к другому в том же окне. На данный момент все различные NSViewControllerSegues представляют контроллер представления в новом окне, будь то модальное или просто другое окно. То, что я хотел бы сделать, - это просто перейти в одно окно, точно так же, как в iOS (хотя анимированный переход не имеет решающего значения). Как это будет достигнуто?

4b9b3361

Ответ 1

Если вы предоставляете пользовательский segue (подкласс NSStoryboardSegue), вы можете получить результат, который вам нужен. Есть несколько исправлений с этим подходом:

  • пользовательский segue будет использовать presentViewController:animator, поэтому вам нужно будет предоставить объект аниматора
  • потому что представленное представление не поддерживается отдельным объектом Window, вам может потребоваться предоставить его настраиваемому NSView, чтобы просто выхватить события мыши, которые вы не хотите распространять в представлении NSViewController.
  • также существует сбой только для Swift, относящийся к пользовательскому ресурсу segue identifier, который вам нужно соблюдать.

Как мне кажется, не так много документации об этом, я создал небольшой демонстрационный проект с пользовательскими примерами segue в Swift и Objective-C.

enter image description here

Я также предоставил более подробную информацию в ответ на этот вопрос.

Ответ 2

(Восстанавливая это, поскольку это появляется как первый релевантный результат в Google, и у меня была та же проблема, но я решил не выполнять пользовательский сеанс)

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

Простым решением для изменения содержимого окна является создание NSWindowController для вашего окна и установка его contentViewController в требуемый viewController. Это особенно полезно, если вы следуете типичной схеме раскадровки и создаете экземпляр нового экземпляра ViewController при каждом переключении.

Однако.

Документация NSStoryboard говорит, что явно в macOS, сдерживание (а не переход) является более распространенным понятием для раскадровки, что привело меня к снова взгляните на доступные инструменты.

Вы можете использовать представление контейнера для этой задачи, которое добавляет слой NWViewController вместо NSWindowController, описанный выше. Решение, с которым я столкнулся, - использовать NSTabViewController. В инспекторе атрибутов установите для стиля "неуказанный" Настройки TabViewController, затем выберите TabView и установите его стиль "tabless". Выбор табуляции Настройки TabView

Чтобы программно изменить вкладки, вы устанавливаете selectedTabViewItemIndex своего TabViewController.

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