如何在没有导航控制器的情况下管理 UITableViews 堆栈
Posted
技术标签:
【中文标题】如何在没有导航控制器的情况下管理 UITableViews 堆栈【英文标题】:how to manage a stack of UITableViews without a navigation controller 【发布时间】:2010-10-21 05:06:05 【问题描述】:我是 iPhone 开发的新手,我正在修改现有的 iPhone 应用程序。这个问题的高级概述是这样的。
我有一个按钮显示包含 UITableView 的弹出窗口。
我想单击一个菜单项并显示带有子项的第二个 UITableView,包括一个后退选项。如果用户点击返回,他们会转到原来的 UITableView。如果子项下面有其他子项,它应该(单击时)使用这些选项启动另一个 UITableView。还有一个后退按钮作为菜单项,允许用户导航到显示的上一个菜单。
这里的挑战是我没有使用导航控制器。最初的开发人员只想将 UITable 视图添加到堆栈中,当您从一个菜单转到另一个菜单时,在它们之间添加过渡。我看过并尝试过的大多数教程都使用导航控制器和 Interface Builder 来关联 UITableView。
现在,我有一个 XML 数据源填充菜单,当我单击菜单项时,标题会正确更改,但仍使用相同的 UITableView 来显示选项 - 这当然会产生一些后果,因为子项目可能不适合屏幕。
关于如何做到这一点的任何想法?如有必要,我可以发布一些代码,尽管我认为一般描述应该能够与你们中的一个聪明人敲响警钟!
【问题讨论】:
我不太明白您为什么要尝试复制导航控制器的功能。另外,您是否尝试使用一个控制器来控制多个 UITableView? 挑战在于 UI 看起来不像传统的导航控制器的外观和感觉。它实际上看起来像一个气球,其中包含一个 UITableView。单击它应该导航到另一个 UITableView。在大多数示例中,我看到 NavigationController 使用整个空间,其中包含分组或标准 UITableView。 是的,尝试控制多个 UITableView。例如,我正在关注的一个教程是blancer.com/tutorials/i-phone/77008/…。 另一个注意事项是“返回”按钮内置在导航控制器中......我希望能够独立放置任何地方作为标准按钮。这有意义吗? 【参考方案1】:这可以通过多种方式完成。
-
我还没有完成第一个,但您可能可以创建一个 UINavigationController 并将其视图设置为适当的框架(在气泡内)隐藏导航栏并设置后退按钮的操作以弹出当前视图控制器.
另一种方法是在一个控制器上拥有多个 tableview,delegate 和 datasource 方法将 UITableView 作为参数,以便在设置行、标题等的高度以及返回 UITableViewCell 时区分它们。
我选择处理此类配置的方式是拥有一个 UITableView 并且只更改数据源。当您重新加载、插入、删除行或重新加载整个表时,您可以根据当前数据源级别更改您想要的任何内容。最简单的无动画方式是重新加载整个表格。
a) 如果你的“选项”离开屏幕高度(你想要固定高度)表格改变 - (CGFloat)tableview:(UITableView *)table heightForRowAtSection:(NSInteger)section 返回值
b) 如果你的“选项”离开屏幕长度,要么让你的单元格的默认 textLabel 灵活:cell.textLabel.adjustsFontSizeToFitWidth = YES; cell.textLabel.minimumFontSize = 14;或为每个数据源级别设置自定义单元格(查找 UITableViewCell 的子类,推荐)。
如果您将 TableViewCells 子类化,请记住每个级别具有不同的出列单元格标识符,因此该表不会为您提供其他级别的单元格类。对于表格视图或数据源的“堆栈”,您可以拥有一个 NSMutableArray,其中 addObject 用于推送,removeLastObject 用于弹出。 对于动画,UITableViews 可以为它们的行/部分设置动画 3.(请参阅插入、删除、重新加载的文档 - Rows/Sections UITableView 类参考),对于 2. 您甚至可以拥有 UIView(如果不是像 Grimless 建议的那样 CoreAnimation)动画,即将当前 tableview 向左移动 (setFrame:) 并从右侧移动下一个 tableview (setFrame 在动画之前离屏,然后在 beginAnimation-commitAnimation 子句中放置),但请确保将 tableviews 添加到容器视图中(气泡内部) 剪辑其子视图。
【讨论】:
哇!不错的细节。我会看看我是否可以从这里开始工作。谢谢【参考方案2】:喂。这将是一个艰难的过程。我的建议是维护您自己的堆栈实现。然后,使用 CoreAnimation 从主视图控制器中添加/删除 UITableViews 以获得动画效果。因此,每当用户单击当前表格视图中的元素时,相应的控制器都会创建一个新的控制器和表格视图,然后您的自定义导航控制器将旧的推入堆栈,从主视图中删除旧的表格视图,设置新控制器作为当前控制器,并将新表视图添加到主视图。有点乱,但我认为它会工作。
【讨论】:
以上是关于如何在没有导航控制器的情况下管理 UITableViews 堆栈的主要内容,如果未能解决你的问题,请参考以下文章
在没有导航控制器的情况下滑动 Web 视图时如何隐藏工具栏?