我正在创建一个应用程序,我在NSUserDefaults中有一个键/值,允许应用程序启动时检测这是否是第一次在设备上打开应用程序。如果是第一次,我希望splitVC(也是rootVC)的详细视图是我的pageViewController(教程),否则我希望它直接进入应用程序(另一个视图控制器) ,让我们今天称之为ViewController)。
我目前有一个用于我的SplitVC(GlobalSplitViewController.swift)的类,但我目前不知道如何以编程方式更改ViewDidLoad中的详细信息视图。
另外,在故事板中,我的splitVC的详细信息segue连接到todayViewController,它的主要信号连接到menuVC,这是完美的。
提前致谢!
GlobalSplitViewController.swift中的代码:
import UIKit
class GlobalSplitViewController: UISplitViewController, UISplitViewControllerDelegate {
var firstTime: Bool!
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
firstTime = loadFistTime()
if firstTime == true {
//load tutorials pageVC
} else {
//load todayVC
}
}
func splitViewController(svc: UISplitViewController, shouldHideViewController vc: UIViewController, inOrientation orientation: UIInterfaceOrientation) -> Bool {
return true
}
答案 0 :(得分:10)
从iOS 8开始,您可以使用:
splitViewController?.showDetailViewController(vc, sender: self)
或者如果要替换主控制器
splitViewController?.show(vc, sender: self)
答案 1 :(得分:5)
例如,在AppDelegate中,您可以检查UserDefaults,使用Switch或If / else可以更改splitView。 以下是更改detailViewController的示例。
let detailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("DetailNavigationViewController") as! UINavigationController
self.splitViewController?.viewControllers[1] = detailViewController
答案 2 :(得分:1)
通话
splitViewController.showDetailViewController(vc, sender: self)
似乎是一个很好的解决方案。但是当在iPhone上调用时,在masterViewController顶部已经显示了detailViewController时,此调用将呈现出没有navigationViewController和后退按钮的detailViewController。因此该应用被卡住了。
弹出旧的detailViewController并显示新的也显示了上述相同的问题。
有效的方法是弹出旧的,等到工作完成后再显示新的。
以下代码假定要在masterViewController中实现:
if let top = navigationController?.topViewController,
top !== self {
if let navController = splitViewController.viewControllers[0] as? UINavigationController {
navController.popViewController(animated: false)
DispatchQueue.main.async {
splitViewController.showDetailViewController(vc, sender: self)
}
return
}
}
splitViewController.showDetailViewController(vc, sender: self)
关键部分是DispatchQueue.main.async
。这样可以确保在显示新细节之前弹出旧细节已经完成。
答案 3 :(得分:0)
我还有另一个建议:
此代码在iPhone上可以正常使用。问题出在iPad上(仅限iPad)
详细信息视图上的导航栏仍然消失(显然,还有返回按钮),但仅在iPad上。
在iPhone上运行完美。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
let firstVC = FIRST()
let secondVC = SECOND()
let firstNC = UINavigationController(rootViewController: firstVC)
let secondNC = UINavigationController(rootViewController: secondVC)
let splitViewController = UISplitViewController()
splitViewController.viewControllers = [firstNC, secondNC]
splitViewController.preferredPrimaryColumnWidthFraction = 1/3
splitViewController.delegate = self
// IMPORTANT to show back button
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
window?.rootViewController = splitViewController
window?.makeKeyAndVisible()
return true
}
// MARK: - Split view
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
guard let topAsDetailController = secondaryAsNavController.topViewController as? SECOND else { return false }
if topAsDetailController.detailItem == nil {
// Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return true
}
return false
}
问题是:
在iPad上失败了吗?我再说一遍,此代码在iPhone上可以正常运行。
(情况是:没有情节提要)