【发布时间】:2020-01-02 02:30:20
【问题描述】:
我正在将我的应用程序转换到 iOS 13,并且 UISplitViewController 在启动时折叠到详细视图,而不是主视图 - 仅在 iPad 上。此外,没有显示后退按钮 - 就好像它是根视图控制器一样。
我的应用程序包含一个UISplitViewController,它已被子类化,符合UISplitViewControllerDelegate。拆分视图包含两个子视图 — 都是 UINavigationControllers,并嵌入在 UITabBarController(子类 TabViewController)中
在拆分视图viewDidLoad 中,代理设置为self,preferredDisplayMode 设置为.allVisible。
由于某种原因,方法 splitViewController(_:collapseSecondary:onto:) 没有被调用。
在 iPhone 和 iPad 上的 iOS 12 中,splitViewController(_:collapseSecondary:onto:) 方法在启动时会在 application(didFinishLaunchingWithOptions) 和 @ 之间正确调用987654334@.
在 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 中却没有!我是一名新开发人员,这是我的第一篇文章,如果我的代码没有提供足够的细节或格式不正确,敬请见谅!
【问题讨论】:
-
请向 Apple 提交错误报告。 iOS 13 自第一个测试版以来就出现了拆分视图问题,Apple 仍未修复这些问题。时间不多了。
-
@rmaddy 你能说得更具体点吗? iOS 13 中新增了哪些拆分视图问题?
-
@rmaddy 谢谢。我很难想象为什么有人会这样做(替换现有拆分视图控制器的两个视图控制器)。一种解决方法是创建和配置一个新的拆分视图控制器并将其替换为旧的(作为窗口的根视图控制器)。
-
@matt 如果 Apple 不修复该错误,那是我的后备计划。只调用
setViewControllers比创建和配置一个全新的拆分视图要简单得多。真正奇怪的是它在 iOS 13 beta 4 中被修复,然后在 beta 5 中再次被破坏。我还没有尝试 13.1。
标签: ios swift ipad uisplitviewcontroller ios13