Почему я не могу размещать представление Master и Detail рядом друг с другом в UISplitViewController при первом запуске, но после его вращения он работает?
У меня есть контроллер разделенного вида, который имеет список элементов слева и подробный вид справа. Соответствующий код в AppDelegate:
let splitViewController = mainView.instantiateViewControllerWithIdentifier("initial") as! UISplitViewController
let rightNavController = splitViewController.viewControllers.last as! UINavigationController
let detailViewController = rightNavController.topViewController as! DetailsIpad
let leftNavController = splitViewController.viewControllers.first as! UINavigationController
let masterViewController = leftNavController.topViewController as! MainViewController
masterSplitViewController = masterViewController
detailSplitViewController = detailViewController
// Override point for customization after application launch.
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
splitViewController.delegate = self
self.window!.rootViewController = splitViewController
Когда я впервые запускаю приложение, я вижу, что правая часть экрана разделения занимает весь экран:
![введите описание изображения здесь]()
Если я поверну экран, он будет правильно установлен (вероятно, потому, что оба вида присутствуют на экране):
![введите описание изображения здесь]()
Когда я устанавливаю точки останова повсюду, я вижу, что подробный вид справа загружается перед основным видом слева (список элементов), несмотря на то, что он не вызывается напрямую.
Я не могу изменить порядок отображения представлений разделенного экрана. Как я могу это исправить?
UPDATE:
Я могу установить это перед представлением контроллера с открытым списком:
splitViewController.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
И в ViewDidLoad раздельного контроллера, когда я его печатаю:
print(self.preferredDisplayMode.rawValue)
Я получаю: 2, который является AllVisible. Но результат все тот же.
Ответы
Ответ 1
Спасибо @Tarun Tyagi за объяснение, но в моем случае предлагаемые действия не сработали. Однако это сработало для меня: в SplitViewController я добавил вызов setNeedsLayout():
override func viewDidAppear(animated: Bool) {
self.view.setNeedsLayout()
}
Это позволит обновить представление, когда изображение уже на экране.
Ответ 2
Это поведение по умолчанию UISplitViewController
. Посмотрите внимательно следующее:
// An animatable property that controls how the primary view controller is hidden and displayed. A value of `UISplitViewControllerDisplayModeAutomatic` specifies the default behavior split view controller, which on an iPad, corresponds to an overlay mode in portrait and a side-by-side mode in landscape.
@property (nonatomic) UISplitViewControllerDisplayMode preferredDisplayMode NS_AVAILABLE_IOS(8_0);
Здесь ключевая часть из того же определения -
на iPad, соответствует режиму наложения в портрете и бок о бок в ландшафте.
Кроме того, если вы хотите запросить текущее состояние (режим отображения) UISplitViewController
, вы должны использовать это свойство -
// The actual current displayMode of the split view controller. This will never return `UISplitViewControllerDisplayModeAutomatic`.
@property (nonatomic, readonly) UISplitViewControllerDisplayMode displayMode NS_AVAILABLE_IOS(8_0);
И помните, вы не можете сравнить это с UISplitViewControllerDisplayModeAutomatic
, потому что -
Это никогда не вернет UISplitViewControllerDisplayModeAutomatic
.
Мое предложение состояло в том, чтобы установить preferredDisplayMode
значение, которое вы хотите. В вашем случае кажется, что вам нужно, чтобы основной (мастер) всегда был видимым. Итак, предлагаемое решение -
mySplitVC.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible
Почему он сначала загружает вторичный (подробный) контроллер?
Как вы можете видеть, экземпляр UISplitViewController
всегда нуждается в подробном представлении независимо от того, что displayMode
он в настоящее время. Так что это хороший звонок
- сначала загрузите подробный вид.
- загрузить основной вид после (условно основанный на displayMode).
Надеюсь, что это поможет.