Я новичок в разработке Mac и немного смущен новой функцией "раскадровки" в Xcode 6. То, что я пытаюсь сделать, это перейти от одного контроллера представления к другому в том же окне. На данный момент все различные NSViewControllerSegues представляют контроллер представления в новом окне, будь то модальное или просто другое окно. То, что я хотел бы сделать, - это просто перейти в одно окно, точно так же, как в iOS (хотя анимированный переход не имеет решающего значения). Как это будет достигнуто?
Как отобразить новый контроллер представления в том же окне Mac?
Ответ 1
Если вы предоставляете пользовательский segue (подкласс NSStoryboardSegue), вы можете получить результат, который вам нужен. Есть несколько исправлений с этим подходом:
- пользовательский segue будет использовать
presentViewController:animator
, поэтому вам нужно будет предоставить объект аниматора - потому что представленное представление не поддерживается отдельным объектом Window, вам может потребоваться предоставить его настраиваемому NSView, чтобы просто выхватить события мыши, которые вы не хотите распространять в представлении NSViewController.
- также существует сбой только для Swift, относящийся к пользовательскому ресурсу segue
identifier
, который вам нужно соблюдать.
Как мне кажется, не так много документации об этом, я создал небольшой демонстрационный проект с пользовательскими примерами segue в Swift и Objective-C.
Я также предоставил более подробную информацию в ответ на этот вопрос.
Ответ 2
(Восстанавливая это, поскольку это появляется как первый релевантный результат в Google, и у меня была та же проблема, но я решил не выполнять пользовательский сеанс)
В то время как пользовательские сегменты работают (по крайней мере, код, указанный в литейном ответе, работал под Swift 3, он нуждается в обновлении для Swift 4), объем работы, связанной с написанием настраиваемого аниматора, подсказывает мне, что их основной вариант использования пользовательские анимации.
Простым решением для изменения содержимого окна является создание NSWindowController для вашего окна и установка его contentViewController в требуемый viewController. Это особенно полезно, если вы следуете типичной схеме раскадровки и создаете экземпляр нового экземпляра ViewController при каждом переключении.
Однако.
Документация NSStoryboard говорит, что явно в macOS, сдерживание (а не переход) является более распространенным понятием для раскадровки, что привело меня к снова взгляните на доступные инструменты.
Вы можете использовать представление контейнера для этой задачи, которое добавляет слой NWViewController вместо NSWindowController, описанный выше. Решение, с которым я столкнулся, - использовать NSTabViewController. В инспекторе атрибутов установите для стиля "неуказанный" , затем выберите TabView и установите его стиль "tabless".
Чтобы программно изменить вкладки, вы устанавливаете selectedTabViewItemIndex
своего TabViewController.
Это решение повторно использует тот же экземпляр ViewControllers для содержимого вкладки, чтобы любые данные, введенные в текстовые поля, сохранялись, когда пользователь переключается на другую вкладку.