- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我的通用应用程序中,我有一个似乎非常常见的设置,具有根 UISplitViewController
,使用 UITabBarController
作为 masterViewController
,然后我想:
UISplitViewController
的 detailViewController 中显示细节 Controller 为此,我的设置与所有提到类似问题的讨论中描述的设置完全相同:
但这些问题中提到的解决方案均无效。其中一些创建无限递归循环和 EXC_BAD_ACCESS
。我尝试的最新方法只是简单地以模态方式呈现细节 View Controller ,而不是将其推送到 iPhone 上的堆栈中。我所做的是创建一个自定义的 UISplitViewController
子类:
class RootSplitViewController: UISplitViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
}
extension RootSplitViewController: UISplitViewControllerDelegate {
func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool {
if let tabController = splitViewController.viewControllers[0] as? UITabBarController {
if(splitViewController.traitCollection.horizontalSizeClass == .compact) {
tabController.selectedViewController?.show(vc, sender: sender)
} else {
splitViewController.viewControllers = [tabController, vc]
}
}
return true
}
func splitViewController(_ splitViewController: UISplitViewController, separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController? {
if let tabController = splitViewController.viewControllers[0] as? UITabBarController {
if let navController = tabController.selectedViewController as? UINavigationController {
return navController.popViewController(animated: false)
} else {
return nil
}
} else {
return nil
}
}
}
下面是主视图 Controller 中显示详细 View Controller 的代码:
self.performSegue(withIdentifier: "showReference", sender: ["tags": tags, "reference": reference])
从 Firebase 加载的 tags
和 reference
在哪里。当然,“showReference”转场属于“显示详细信息(例如替换)”类型。
第一个委托(delegate)方法被正确调用,当我在 UITabBarController
中单击列表中的项目时,断点就证明了这一点。然而细节 View Controller 仍然以模态方式呈现在 iPhone 上。不过在 iPad 上没问题:细节 View Controller 出现在右侧,正如预期的那样。
上面提到的大多数答案都非常陈旧,一些解决方案是在 Objective-C 中实现的,所以可能我在转换中做错了什么,或者从那时起 UISplitViewController
实现中发生了一些变化。
有人有什么建议吗?
最佳答案
我想通了。事实上,它与我试图展示的目标 View Controller 有关。在 UISplitViewControllerDelegate
中我覆盖的 2 个方法中,只有第一个被调用:
func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool {
if let tabController = splitViewController.viewControllers[0] as? UITabBarController {
if(splitViewController.traitCollection.horizontalSizeClass == .compact) {
tabController.selectedViewController?.show(vc, sender: sender)
} else {
splitViewController.viewControllers = [tabController, vc]
}
}
return true
}
但我在测试的第一个分支中显示的 View Controller 已经嵌入到 UINavigationController
中,所以我实际上是在将 UINavigationController
显示到另一个中,并且在那种情况下,模式更有意义。所以在这种情况下,我需要显示 UINavigationController
的顶 View Controller ,我认为这是我在委托(delegate)中重写的第二个方法的目的,但它从未被调用过。所以我通过以下实现就在那里做到了:
extension RootSplitViewController: UISplitViewControllerDelegate {
func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool {
if let tabController = splitViewController.viewControllers[0] as? UITabBarController {
if(splitViewController.traitCollection.horizontalSizeClass == .compact) {
if let navController = vc as? UINavigationController, let actualVc = navController.topViewController {
tabController.selectedViewController?.show(actualVc, sender: sender)
navController.popViewController(animated: false)
} else {
tabController.selectedViewController?.show(vc, sender: sender)
}
} else {
splitViewController.viewControllers = [tabController, vc]
}
}
return true
}
}
这似乎在 iPhone 和 iPad 上都能完美运行
关于ios - UINavigationController inside UITabBarController inside UISplitViewController(仍然)以模态方式显示细节 Controller 而不是推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758146/
我知道 UISplitViewController 只能用作根 Controller 。但是否可以从一个分割 View 转到另一个分割 View ? 喜欢加载具有不同数据和布局的详细 View 和主视
然后将其合并到垂直 View 中?这是来自 IMDB 应用程序的示例。 http://img39.imageshack.us/img39/5636/imdb2.jpg http://img39.ima
iOS 5.1 中与 UISplitViewController 相关的新行为应用程序似乎正在拦截 UISlider产生不良结果的运动。这可能也适用于 UISegmented控件和任何其他处理从左到右
我有一个 UISplitViewController,并尝试从 MasterViewController 获取事件并完全更改 DetailViewController。据我了解,这基本上可以通过执行以
每当用户在iPad的UIsplitView中从横向 View 切换到纵向 View 时,我都希望使弹出窗口 View 可见。虽然用户可以通过单击条形按钮使其可见,但我希望此操作对于纵向模式是自动的。
我最近遇到了一个问题。我的iPad应用程序某种程度上阻止了iPad自动旋转。我的应用程序加载了一个UISplitView,这两个 View Controller 都为shouldAutorotateT
我正在开发一个 iPadOS 应用程序,我在其中使用了 UISplitViewController。到目前为止,我一直在使用旧的 API 并手动处理所有内容(包括 displayModeButtonI
我正在尝试将 splitview Controller 添加为 subview Controller 。父 View Controller 是导航 Controller 。父 View Control
我在我的应用程序中使用 MGSplitViewController 库。直到 iOS7 都可以正常工作,但是对于 iOS8 来说,它不能按预期工作,原因是iOS8中 UIPopoverControll
我有一个根 UISplitViewController,其中包含与 DetailViewController 相关的 UINavigationController。 DetailViewControl
我在让 UISplitViewController 在通用应用程序中工作时遇到问题,我已经对 iPhone 部分进行了编码。作为一种故障排除方法,我决定从一个新项目开始,并尝试执行导致问题的一个操作,
我想在纵向模式下创建一个 UISplitViewController,就像在“设置”应用程序中一样。我该怎么做? 最佳答案 有点晚了,还看一下MGSplitViewController作者:马特·格梅
如何在横向模式下隐藏splitviewcontroller的detailView中的导航Bar? 在详细 View 中,我尝试过这样 self.navigationController.navigat
在我的 iPad 应用程序中,我使用带有两个 UINavigationControllers 作为主控和细节的 UISplitViewController。在 Potrait 中,我希望通过 UIPo
在我的 iPad 应用程序中。我正在处理 UISplitViewController .在 DetailViewController的 UISplitViewController有按钮。当按下该按钮时
我想知道是否可以使用带有按钮的普通 ViewController,当您单击按钮时,它会显示一个新的 Controller ,该 Controller 分为两个带有 uisplitviewcontrol
我设置了一个非常简单的 iOS splitView Controller 项目,它有一个非常奇怪的错误。如果您以横向模式启动应用程序,请单击一个按钮以打开另一个 View ,旋转到纵向,然后返回到起始
抱歉,如果之前已经发布过此内容,我浏览了 Apple Docs 等,但找不到有关 UISplitViewController 工作原理的良好解释。 我问这个问题是因为我为 UINavigationBa
我有一个带有 SplitView 的应用程序,可让您将公司添加到数据库中。在 masterView 中,公司显示其各自的公司名称。点击其中一家公司会向我显示“viewCell”中的地址(实际上不是单元
我们正在使用 UISplitViewController。当不处于“分割模式”时显示详细 View Controller 时,屏幕顶部会出现一个灰色条。有谁知道为什么会发生这种情况。在分割 View
我是一名优秀的程序员,十分优秀!