UISplitViewController 作为自定义选项卡栏控制器的子项
UISplitViewController as child of custom tab bar controller
我一直在关注 this tutorial 为 iPad 应用程序创建自定义标签栏控制器,因为我想实现垂直标签栏。但是,我希望其中一个选项卡显示 UISplitViewController
,而其他选项卡只显示 UIViewControllers
。我的问题是:
1) 这会被应用商店接受吗? Apple 的文档当前声明不建议将 UISplitViews
添加为子视图,但可以使用某些容器来实现。有人有这方面的经验吗?
2) 这是我的自定义标签栏控制器的摘录。如果 secondViewController 正在呈现 UISplitView,我可以保持原样吗?我的意思是,当我 运行 时它似乎可以找到,但它可以接受吗?
class CustomTabBarController: UIViewController {
@IBOutlet weak var tabView: UIView!
@IBOutlet var tabButtons: [UIButton]!
var firstViewController: UIViewController!
var secondViewController: UISplitViewController!
var thirdViewController: UIViewController!
var viewControllerArray: [UIViewController]!
var selectedTabIndex: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
firstViewController = storyboard.instantiateViewController(withIdentifier: "firstVC")
secondViewController = storyboard.instantiateViewController(withIdentifier: "secondVC") as! UISplitViewController
thirdViewController = storyboard.instantiateViewController(withIdentifier: "thirdVC")
viewControllerArray = [firstViewController, secondViewController, thirdViewController]
tabButtons[selectedTabIndex].isSelected = true
didPressTab(tabButtons[selectedTabIndex])
}
3) 我无法真正理解 AppDelegate
需要什么(如果有的话)?再次似乎 运行 很好,但只是想知道它是否安全。
谢谢。
1) 我相信 Apple 只是建议不要将此视为潜在的不良设计,因为他们将您推荐给 Human Interface Guidelines。您不必总是同意他们的建议,而且您的应用很少会因为设计选择而被拒绝——我唯一想到的例子就是模仿 App Store 或其他核心 OS 功能。
2) 如果像您所说的那样有效,我没有发现任何明显的问题。
3) 同样,如果它正常工作,您可能不需要执行任何操作。但以下是 Apple 为 Master-Detail 应用程序设置模板的方式:
如果您的 splitViewController 是这样设置的,并且您想要与此模板相同的功能,那么您应该可以通过以下方式获得它。
首先将此添加到 AppDelegate.swift 的最底部:
extension AppDelegate: UISplitViewControllerDelegate {
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? DetailViewController 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
}
}
然后,将此添加到 CustomTabBarController 中的 viewDidLoad 的末尾:
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}
let navigationController = secondViewController.viewControllers[secondViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = secondViewController.displayModeButtonItem
secondViewController.delegate = appDelegate
我一直在关注 this tutorial 为 iPad 应用程序创建自定义标签栏控制器,因为我想实现垂直标签栏。但是,我希望其中一个选项卡显示 UISplitViewController
,而其他选项卡只显示 UIViewControllers
。我的问题是:
1) 这会被应用商店接受吗? Apple 的文档当前声明不建议将 UISplitViews
添加为子视图,但可以使用某些容器来实现。有人有这方面的经验吗?
2) 这是我的自定义标签栏控制器的摘录。如果 secondViewController 正在呈现 UISplitView,我可以保持原样吗?我的意思是,当我 运行 时它似乎可以找到,但它可以接受吗?
class CustomTabBarController: UIViewController {
@IBOutlet weak var tabView: UIView!
@IBOutlet var tabButtons: [UIButton]!
var firstViewController: UIViewController!
var secondViewController: UISplitViewController!
var thirdViewController: UIViewController!
var viewControllerArray: [UIViewController]!
var selectedTabIndex: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
firstViewController = storyboard.instantiateViewController(withIdentifier: "firstVC")
secondViewController = storyboard.instantiateViewController(withIdentifier: "secondVC") as! UISplitViewController
thirdViewController = storyboard.instantiateViewController(withIdentifier: "thirdVC")
viewControllerArray = [firstViewController, secondViewController, thirdViewController]
tabButtons[selectedTabIndex].isSelected = true
didPressTab(tabButtons[selectedTabIndex])
}
3) 我无法真正理解 AppDelegate
需要什么(如果有的话)?再次似乎 运行 很好,但只是想知道它是否安全。
谢谢。
1) 我相信 Apple 只是建议不要将此视为潜在的不良设计,因为他们将您推荐给 Human Interface Guidelines。您不必总是同意他们的建议,而且您的应用很少会因为设计选择而被拒绝——我唯一想到的例子就是模仿 App Store 或其他核心 OS 功能。
2) 如果像您所说的那样有效,我没有发现任何明显的问题。
3) 同样,如果它正常工作,您可能不需要执行任何操作。但以下是 Apple 为 Master-Detail 应用程序设置模板的方式:
如果您的 splitViewController 是这样设置的,并且您想要与此模板相同的功能,那么您应该可以通过以下方式获得它。
首先将此添加到 AppDelegate.swift 的最底部:
extension AppDelegate: UISplitViewControllerDelegate {
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? DetailViewController 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
}
}
然后,将此添加到 CustomTabBarController 中的 viewDidLoad 的末尾:
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}
let navigationController = secondViewController.viewControllers[secondViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = secondViewController.displayModeButtonItem
secondViewController.delegate = appDelegate