如何更改细节在swift中以编程方式在splitViewController中查看

时间:2016-06-29 07:06:04

标签: ios xcode swift uisplitviewcontroller

我正在创建一个应用程序,我在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
}

4 个答案:

答案 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上可以正常运行。

(情况是:没有情节提要