2017-02-21 11 views
0

Я бегу на вопрос, где после изменения rootViewController на моем UINavigationController и изменить его обратно к моей первоначальной UINavigationController, UISplitViewController начинает показывать как это мастер и подробно просмотр в телефонном устройстве на компактной/портретной ориентации (так что не только на телефонах с дополнительным размером, но и на других).Изменение RootViewController для Nav вызывает UISplitViewController, чтобы показать подробно на Compact портретной ориентации

Базовый обзор архитектуры: A TabBarController Дома несколько вкладок. Один из этих вкладок - UISplitViewController. В настоящее время я переопределять следующее, чтобы убедиться, что MasterViewController показано на компактных ориентациях:

func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { 

    // this prevents phone from going straight to detail on showing the split view controller 
    return true 
} 

Это прекрасно работает и отображает мастер на портрете, как и ожидалось. В любой момент нажатием кнопки на другой вкладке можно создать новый экземпляр UINavigationController и отобразить его, в котором я делаю ниже, чтобы изменить rootViewController на вновь созданный UINavigationController на дисплее:

let appDelegate = UIApplication.shared.delegate 
appDelegate?.window??.rootViewController = newNavVC 

На распускать, я 'просто поменяв UINavigationController обратно на оригинал по тому же коду выше. Однако, как только я сделаю это один раз (создаю nav/display/увольнение), и я переключу свою вкладку обратно на страницу с UISplitViewController, она сама изменится, чтобы показать бок о бок подробное представление. Я не знал, что это возможно в портретном режиме для компактной калибровки. Я попытался перейти на любой из 4 предпочтительных режимов отображения в UISplitViewController, но это не исправить.

Ниже приведено то, на что это похоже (симулятор iPhone 6), я пропускаю делегатов или недоразумение, рушится?

Перед: enter image description here

После: enter image description here

ответ

1

Вы можете заменить логика, которая назначена RootViewController с фрагмента кода найденного по этой ссылке:

Leaking views when changing rootViewController inside transitionWithView

Основы вы просто создаете расширение для класса UIWindow, которое правильно установит контроллер корневого представления.

extension UIWindow { 

/// Fix for https://stackoverflow.com/a/27153956/849645 
func set(rootViewController newRootViewController: UIViewController, withTransition transition: CATransition? = nil) { 

    let previousViewController = rootViewController 

    if let transition = transition { 
     // Add the transition 
     layer.add(transition, forKey: kCATransition) 
    } 

    rootViewController = newRootViewController 

    // Update status bar appearance using the new view controllers appearance - animate if needed 
    if UIView.areAnimationsEnabled { 
     UIView.animate(withDuration: CATransaction.animationDuration()) { 
      newRootViewController.setNeedsStatusBarAppearanceUpdate() 
     } 
    } else { 
     newRootViewController.setNeedsStatusBarAppearanceUpdate() 
    } 

    /// The presenting view controllers view doesn't get removed from the window as its currently transistioning and presenting a view controller 
    if let transitionViewClass = NSClassFromString("UITransitionView") { 
     for subview in subviews where subview.isKind(of: transitionViewClass) { 
      subview.removeFromSuperview() 
     } 
    } 
    if let previousViewController = previousViewController { 
     // Allow the view controller to be deallocated 
     previousViewController.dismiss(animated: false) { 
      // Remove the root view in case its still showing 
      previousViewController.view.removeFromSuperview() 
     } 
    } 
} 
+1

Не нужно сообщать нам, кто вы и почему вы публикуете сообщения. Просьба указать соответствующие биты ссылки, чтобы упростить чтение здесь. – nloewen

+0

Спасибо за подсказку! Ответ изменен. –

Смежные вопросы