Bel*_*000 10 ipad uisplitviewcontroller ios swift ios13
我正在将应用程序过渡到iOS 13,并且UISplitViewController折叠到详细信息视图上,而不是在启动时折叠到主视图上-仅在iPad上。此外,后退按钮也没有显示-好像它是根视图控制器一样。
我的应用程序包含一个UISplitViewController已被子类化的,符合UISplitViewControllerDelegate。拆分视图包含两个子视图-两者都UINavigationControllers嵌入到UITabBarController(子类TabViewController)中
在拆分视图中viewDidLoad,委托设置为self,preferredDisplayMode并且设置为.allVisible。
由于某种原因,splitViewController(_:collapseSecondary:onto:)未调用该方法。
在iOS版12在iPhone和iPad上,该方法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中却没有!我是一名新开发人员,这是我的第一篇文章,因此,如果我的代码没有提供足够的细节或格式不正确,我们深表歉意!
出于某种原因,在 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。
| 归档时间: |
|
| 查看次数: |
950 次 |
| 最近记录: |