两个 UIView,一个 UIViewController(在一个 UINavigationController 中)
Posted
技术标签:
【中文标题】两个 UIView,一个 UIViewController(在一个 UINavigationController 中)【英文标题】:Two UIViews, one UIViewController (in one UINavigationController) 【发布时间】:2010-06-15 20:48:32 【问题描述】:给定一个将 UITableViewController 推到 UINavigationController 上的 iPhone 应用程序,我想添加一个右栏按钮项以在表格视图和“替代”之间切换查看相同的数据。我们还假设这个其他视图使用相同的数据,但 不是 UITableView。
现在,我知道 Stack Overflow 上已经存在这个问题的变体。但是,在这种情况下,该替代视图不会被推送到 UINavigationController。这在视觉上类似于将当前 UIViewController 的表视图翻转过来并显示另一个视图,然后能够翻转回来。换句话说,它打算在 UINavigationController 层次结构中占据一个位置。
此外,您最终在任一视图中做出的任何选择都会将一个通用 UIViewController 推送到 UINavigationController 堆栈中。
更多信息:我们不想使用单独的 UINavigationController 来处理这对视图,也不想通过 UITabBarController 将它们分开强>要么。在视觉和上下文上,用户体验旨在展示同一枚硬币的两个面。只是这两个方面在正常实践中碰巧涉及到自己的 View Controller。
现在……事实证明我已经走了,并迅速进行了设置,看看它是如何工作的!然而,在回过头来检查它时,我有一个明显的印象,我是以一种相当非 MVC 的方式来处理它的,这当然让我有点担心。
这是我在高层次上所做的。
现在,我有一个 UIViewController(不是 UITableViewController)来处理两个视图之间的所有共性,例如获取原始视图数据。我还有两个 NIB,一个用于每个视图,还有两个 UIView 对象与它们一起使用。 (其中一个是UITableView,它是一种UIView。)
我使用动画在视图之间切换(很简单)。此外,为了保持封装,现在拆分的 UITableView(不是 UIViewController!)充当自己的委托和数据源,从风险投资。 VC 在表视图中被设置为一个弱的、非保留的对象。同时,备用视图以完全相同的方式从 VC 获取原始数据。
所以,这里有一些东西闻起来很有趣。从孩子到父母的弱联系,虽然礼貌,但似乎可能是错误的。制作 UITableView 表的数据源和委托对我来说似乎也很奇怪,认为视图控制器是您希望根据 Apple 的 MVC 图表放置它的位置。就目前而言,看起来好像视图知道模型,这是不好的。提前加载两个视图似乎也很奇怪,因为延迟加载不再有效。失去 UITableViewController 的好处(比如自动滚动到带有文本字段的单元格)也有点令人沮丧,我也不想重新发明***来解决这个问题。
鉴于以上所有情况,并且我们希望在单个 UINavigationController 上的单个点的上下文中实现“翻转效果”,并且鉴于两个视图是同一枚硬币的两个面,有没有更好、更明显的方法来设计这个我碰巧完全错过的?线索赞赏!
【问题讨论】:
【参考方案1】:我的方法如下,但我没有对此进行测试。 UINavigationController 有一个属性 viewControllers,它返回当前在导航控制器堆栈上的视图控制器数组。还有一种方法 setViewControllers:animated,它允许您一次设置导航控制器的所有视图控制器。当用户想要从表格视图切换到备用视图时,请执行以下操作: 1. 获取导航控制器堆栈上的视图控制器数组。 2. 用 tableView 或替代的非表格视图控制器替换最终的数组元素。 2. 使用 setViewControllers:animated 将堆栈放回导航控制器中,并将所需的视图控制器放在顶部。
如果需要,翻转动画必须在视图控制器的 viewDidLoad 或 viewDidAppear 方法中处理。
【讨论】:
嗯,一个有趣的选择 - 谢谢!我想我需要切换到单独的 VC 才能实现这一目标,但乍一看这听起来很合理。以上是关于两个 UIView,一个 UIViewController(在一个 UINavigationController 中)的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式创建控制器和 UIView 而不使用界面构建器? [关闭]
UIPageViewController 和 UIScrollView
我必须使用协议/委托来让 ViewController 执行在另一个类中创建的 UIButton 的操作吗?