swift splitview控制器显示详细视图,即使它是空的

时间:2015-01-30 21:35:09

标签: ios swift uisplitviewcontroller

我使用的是拆分视图控制器。当我在某些设备中启动它时,主视图被隐藏,只显示细节。详细信息为空,因为尚未在master中选择行。

所以,我需要一个解决方案,它是以下之一:

1)将详细视图默认为主视图中的第一项。

2)自动显示主视图,方法是让它看起来如何。

正在使用自动[<导航栏中的主视图]栏按钮,swift会自动为您添加。

3 个答案:

答案 0 :(得分:2)

正如其他人所分享的那样,这与放松细分无关。

如果您查看由Master-Detail模板生成的 AppDelegate.swift 代码,您将看到此UISplitViewControllerDelegate方法,该方法决定是否显示详细信息视图崩溃时:

func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController!, ontoPrimaryViewController primaryViewController:UIViewController!) -> Bool {
    if let secondaryAsNavController = secondaryViewController as? UINavigationController {
        if let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController {
            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
}

示例代码正在检查详细视图控制器的detailItem属性,以查看它是否有任何详细信息。如果是,则在折叠时显示详细视图,否则将显示主视图。

您必须修改此代码以检查您正在使用的特定属性,该属性包含主人将传递给其详细信息的详细信息项目" showDetail" prepareForSegue

完成此操作后,折叠时不会显示详细信息视图(如果为空)。

答案 1 :(得分:1)

我可以在加载时将第一行项目放入详细视图中。这里是master的viewDidLoad,即使它没有显示给用户也会被调用。

override func viewDidLoad() {
    getItems() // gets the items from the web service

    if let split = self.splitViewController{
        let controllers = split.viewControllers
        self.detailViewController = controllers[controllers.count-1].topViewController as? DetailViewController

        // this line sets the "default" item
        self.detailViewController?.detailItem = items.items[0]
    }
}

现在,在用户登录并显示详细信息视图后,它已经填充了第一个项目。

答案 2 :(得分:0)

我遇到了同样的问题并且找到了附带的解决方案。也许它可以提供一些帮助。

splitViewController的显示类与故事板中的splitViewController链接。

//
//  InfoMainSplitViewController.swift
//

import UIKit

class InfoMainSplitViewController: UISplitViewController, UISplitViewControllerDelegate {

    // MARK: - Global variables
    // variable to control if the detail view should be collapsed on launch
    var forceDetailToColapse : Bool = false


    // MARK: - Lifetime management
    override func viewDidLoad() {
        super.viewDidLoad()
        // set the delegate to get access to the delegate methods
        self.delegate = self

        // if this is an iPad, show both scenes (selection and detail) side by side
        if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad) {

            // we have an iPad, so set the mode
            self.preferredDisplayMode = UISplitViewControllerDisplayMode.allVisible

            // we do not want to collapse the detail view on launch
            forceDetailToColapse = false

        } else {

            // we have an iPhone, set the mode
            self.preferredDisplayMode = UISplitViewControllerDisplayMode.automatic

            // make sure we collapse the detail view on launch
            forceDetailToColapse = true
        }
    }


    // MARK: - Delegate methods
    // used to collapse the detail view
    // BTW: this method will not be called if preferredDisplayMode == UISplitViewControllerDisplayMode.allVisible
    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {

        // true: detail view will collapse, false: detail View will not collapse
        return forceDetailToColapse 
    }
}