Как использовать UISplitViewController в Swift

поэтому я добавляю UISplitViewController к проекту, который встроен с UITabBarController.

на UISplitViewController есть UINavigationController как отношение Master & Detail со своим собственным корневым контроллером.

Мастер UINavigationController rootController имеет детальный переход к деталям UINavigationController.

смотрите здесь:

enter image description here

все довольно просто, верно ? Теперь в TableViewController я делаю следом;

class TableViewController: TableViewController, UISplitViewControllerDelegate {

var collapseDetailViewController: Bool  = false

override func viewDidLoad() {
    super.viewDidLoad()

    splitViewController?.delegate = self
}


override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    collapseDetailViewController = false
}

// MARK: - UISplitViewControllerDelegate

func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool {
    return false
}

я также имею расширение UISplitViewController и делаю следующее;

extension UISplitViewController: UISplitViewControllerDelegate {

public override func viewDidLoad() {
    self.extendedLayoutIncludesOpaqueBars = true
}  

}

со всем этим я получаю следующие проблемы;

  • при нажатии на tableviewcell для перехода к детальному просмотру детальный вид открывается в главной левой панели, когда на iPad в ландшафте, а не справа. Я также не могу понять, как показать главный вид как первый вид, когда в портрете на iPad или на iPhone. Эти двое проблемы могут быть или не быть связаны, я не уверен.

    enter image description here

  • на мобильном телефоне есть нижняя панель над панелью вкладок, которую я не могу понять, как удалить. У меня была такая же проблема на iPad, пока я добавил код UISplitViewController расширения viewDidLoad однако это не повлияло на мобильный телефон. См. здесь

enter image description here

PS: Я не уверен, что вопрос слишком Лонг, я чувствовал, что лучше всего поместить все в контекст. Также я провел много исследований, но я не могу найти никаких ресурсов в swift, которые используют UITabBarController.

я следовал следующему руководству http://nshipster.com/uisplitviewcontroller/

2 ответов


вы так близко просто сделать следующее.

сохраните макет split view с подробными сегментами и верните true для следующего метода и удалите остальную часть кода, чтобы сделать с переменной collapseDetailViewController.

func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool {
return true    
}

поместите следующее в контроллер Master View

self.splitViewController!.delegate = self;

self.splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible

self.extendedLayoutIncludesOpaqueBars = true  

добавить self.extendedLayoutIncludesOpaqueBars = true к вашему контроллеру подробного представления, как упоминалось в предыдущем ответе. Это должно удалить панель, появляющуюся на контроллерах представления.

кроме того, если вы требуется дополнительная функциональность добавьте следующее, Если вы хотите, чтобы ваш подробный вид использовал полный экран на iPad.

navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem()
navigationItem.leftItemsSupplementBackButton = true

что касается мастера splitViewController, чтобы быть видимым, вам нужно добавить это в ViewDidLoad splitViewController. Иначе контроллер master view присутствует в виде бокового меню, которое вы можете перетащить в портретном режиме

self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;

но этот основной вид детали будет виден только в iphone 6 plus и ipad, иначе он будет действовать как навигационный контроллер. Что касается нажатия viewController на навигационный контроллер, вы пытаетесь нажать навигационный контроллер на еще один навигационный контроллер. Не думаю, что это рекомендуется. Просто переместите segue из контроллера первого вида (где вы вводите текст) во второй(контроллер цветного вида), а не второй навигационный контроллер. Если вам интересно показать подробности в правом разделе для ipad и iphone6, а также в качестве новой страницы для других устройств, вы не должны использовать этот способ, удалите push segue и используйте делегат для передачи информации об изменении и обновлении данных ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.

Storyboard screenshot

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

для получения подробной информации о поведении контроллера split view в iphone и iPad, просто проверьте https://www.raywenderlich.com/94443/uisplitviewcontroller-tutorial-getting-started

попробовать добавление self.extendedLayoutIncludesOpaqueBars = true к viewDidLoad вашего navigationController для проблемы разрыва