我正在将我的应用程序过渡到iOS 13,但是在iPad上,UISplitViewController
在启动时会折叠到详细视图而不是主视图。同时,“返回”按钮没有显示出来,就像它是根视图控制器一样。
我的应用程序由 UISplitViewController
组成,已被子类化并符合 UISplitViewControllerDelegate
。分割视图包含两个子项——都是 UINavigationControllers
,并嵌入在一个 UITabBarController
(子类化的 TabViewController
) 中。
在分割视图的 viewDidLoad
中,将代理设置为 self
,并将 preferredDisplayMode
设置为 .allVisible
。
由于某种原因,方法 splitViewController(_:collapseSecondary:onto:)
没有被调用。
在 iOS 12 的 iPhone 和 iPad 上,在 application(didFinishLaunchingWithOptions)
和 applicationDidBecomeActive
之间正确调用了方法 splitViewController(_:collapseSecondary:onto:)
。
在 iOS 13 的 iPhone 上,在 scene(willConnectTo session:)
和 sceneWillEnterForeground
之间正确调用了方法 splitViewController(_:collapseSecondary:onto:)
。
然而,在 iOS 13 的 iPad 上,如果窗口在启动时具有紧凑的宽度,例如作为拆分视图创建的新场景,则根本不会调用 splitViewController(_:collapseSecondary:onto:)
方法。只有当将窗口扩展到常规宽度,然后缩小窗口时才会调用该方法。
class SplitViewController: UISplitViewController, UISplitViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
preferredDisplayMode = .allVisible
}
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
print("Split view controller function")
guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false }
if topAsDetailController.passedEntry == nil {
return true
}
return false
}
}
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Setup split controller
let tabViewController = self.window!.rootViewController as! TabViewController
let splitViewController = tabViewController.viewControllers![0] as! SplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
navigationController.topViewController!.navigationItem.leftBarButtonItem?.tintColor = UIColor(named: "Theme Colour")
splitViewController.preferredDisplayMode = .allVisible
}
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 13.0, *) {
} else {
let tabViewController = self.window!.rootViewController as! TabViewController
let splitViewController = tabViewController.viewControllers![0] as! SplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
navigationController.topViewController!.navigationItem.leftBarButtonItem?.tintColor = UIColor(named: "Theme Colour")
splitViewController.preferredDisplayMode = .allVisible
}
return true
}
让我感到困惑的是,这个方法在iPhone上被调用,但在iPad上却没有!我是一名新开发者,这是我的第一篇帖子,如果我的代码没有提供足够的细节或格式不正确,请谅解!
setViewControllers
就比创建和配置一个全新的分屏视图简单得多。真正奇怪的是,在 iOS 13 beta 4 中已经修复了它,但在 beta 5 中又出现了问题。我还没有尝试过 13.1。 - rmaddy