在iPad iOS 13上启动时,UISplitViewController无法正确折叠

Bel*_*000 10 ipad uisplitviewcontroller ios swift ios13

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

我的应用程序包含一个UISplitViewController已被子类化的,符合UISplitViewControllerDelegate。拆分视图包含两个子视图-两者都UINavigationControllers嵌入到UITabBarController(子类TabViewController)中

在拆分视图中viewDidLoad,委托设置为selfpreferredDisplayMode并且设置为.allVisible

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

iOS版12iPhoneiPad上,该方法splitViewController(_:collapseSecondary:onto:)被正确调用的推出,之间application(didFinishLaunchingWithOptions)applicationDidBecomeActive

iPhone上的iOS 13中,该方法在启动时在和之间正确调用。splitViewController(_:collapseSecondary:onto:)scene(willConnectTo session:)sceneWillEnterForeground

的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
    }
}
Run Code Online (Sandbox Code Playgroud)
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

}
Run Code Online (Sandbox Code Playgroud)
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
    }
Run Code Online (Sandbox Code Playgroud)

让我感到困惑的是,为什么在iPhone中调用此方法,而在iPad中却没有!我是一名新开发人员,这是我的第一篇文章,因此,如果我的代码没有提供足够的细节或格式不正确,我们深表歉意!

use*_*617 7

出于某种原因,在 iOS 13 上,特别是在 iPad 上的紧凑 traitCollections 中,在 UISplitViewController 上调用 viewDidLoad 之前调用委托以查看它是否应该折叠,因此当它进行该调用时,您的委托未设置,并且该方法永远不会被调用。

如果您以编程方式创建 splitViewController,这是一个简单的解决方法,但如果您使用 Storyboards 则不是很多。您可以通过在awakeFromNib() 而不是viewDidLoad() 中设置您的委托来解决此问题

使用原始帖子中的示例,代码示例如下

class SplitViewController: UISplitViewController, UISplitViewControllerDelegate {
    override func awakeFromNib() {
        super.awakeFromNib()
        delegate = self
        preferredDisplayMode = .allVisible
    }

    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

您还需要确保在 collapseSecondary 函数中使用的任何逻辑都没有引用尚未填充的变量,因为尚未调用 viewDidLoad。

  • 这对我来说似乎仍然不起作用。即使我在“awakeFromNib”中设置了“delegate”,“collapseSecondary”方法也永远不会被调用 (5认同)