UISplitViewController不会在iPad iOS 13上启动时正确折叠

问题描述 投票:10回答:1

我正在将我的应用程序过渡到iOS 13,UISplitViewController会折叠到详细视图上,而不是在启动时折叠到主视图上-仅在iPad上。另外,后退按钮也没有显示-好像它是根视图控制器。

我的应用程序由UISplitViewController组成,该子类已被子类化,与UISplitViewControllerDelegate一致。拆分视图包含两个子视图-均为UINavigationControllers,并嵌入在UITabBarController(子类TabViewController

在分割视图viewDidLoad中,将委托设置为self,将preferredDisplayMode设置为.allVisible

由于某种原因,未调用方法splitViewController(_:collapseSecondary:onto:)

iPhoneiPad上的iOS 12]中,在启动时正确地在splitViewController(_:collapseSecondary:onto:)application(didFinishLaunchingWithOptions)之间调用方法applicationDidBecomeActive。>>

iPhone上的iOS 13

中,在启动时正确地在splitViewController(_:collapseSecondary:onto:)scene(willConnectTo session:)之间调用了sceneWillEnterForeground方法。

但是在iPad]上的iOS 13中,如果窗口在启动时具有紧凑的宽度,例如在创建为拆分视图的新场景中,根本不会调用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中却没有!我是一名新开发人员,这是我的第一篇文章,因此,如果我的代码没有提供足够的细节或格式不正确,我们深感抱歉!

我正在将我的应用程序过渡到iOS 13,UISplitViewController会折叠到详细视图上,而不是在启动时折叠到主视图上-仅在iPad上。此外,后退按钮也没有显示-好像是...

经过几个小时的研究,您可以尝试删除

splitViewController.preferredDisplayMode = .allVisible

在SceneDelegate类中。

它经过测试并成功显示在iOS 13 iPad Pro(12.9英寸)模拟器中。

ios swift ipad uisplitviewcontroller ios13
1个回答
0
投票

经过几个小时的研究,您可以尝试删除

© www.soinside.com 2019 - 2024. All rights reserved.