swift splitview 控制器显示详细视图,即使它是空的
swift splitview controller showing detail view even though it is empty
我正在使用拆分视图控制器。当我在某些设备上启动它时,主视图是隐藏的,只显示细节。详细信息为空,因为尚未在 master 中选择一行。
所以,我需要一个解决方案,它是以下之一:
1) 默认详细视图为主视图中的第一项。
2) 自动显示主视图,或者通过某种方式使其可见。
它是使用swift自动为您添加的导航栏中的自动[<主视图]栏按钮。
正如其他人所分享的那样,这与展开 segues 无关。
如果您查看主从模板生成的 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" [=13 中的详细信息的详细信息项目=].
完成此操作后,如果详细视图为空,则在折叠时将不会显示。
加载时,我能够将项目的第一行放入详细信息视图中。这是 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]
}
}
现在在用户登录并显示详细信息视图后,它已经填充了第一项。
我遇到了同样的问题,来到附件解决方案。也许是为了一些帮助。
所示 class 的 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
}
}
我正在使用拆分视图控制器。当我在某些设备上启动它时,主视图是隐藏的,只显示细节。详细信息为空,因为尚未在 master 中选择一行。
所以,我需要一个解决方案,它是以下之一:
1) 默认详细视图为主视图中的第一项。
2) 自动显示主视图,或者通过某种方式使其可见。
它是使用swift自动为您添加的导航栏中的自动[<主视图]栏按钮。
正如其他人所分享的那样,这与展开 segues 无关。
如果您查看主从模板生成的 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" [=13 中的详细信息的详细信息项目=].
完成此操作后,如果详细视图为空,则在折叠时将不会显示。
加载时,我能够将项目的第一行放入详细信息视图中。这是 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]
}
}
现在在用户登录并显示详细信息视图后,它已经填充了第一项。
我遇到了同样的问题,来到附件解决方案。也许是为了一些帮助。
所示 class 的 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
}
}