如何在没有导航控制器的情况下管理一堆UITableViews

时间:2010-10-21 05:06:06

标签: iphone objective-c uitableview uinavigationcontroller

我是iPhone开发的新手,我正在修改现有的iPhone应用程序。该问题的高级概述是这样的。

我有一个按钮,显示包含UITableView的弹出窗口。

我想点击菜单项并显示第二个带子项的UITableView,包括后退选项。如果用户单击后退,则会转到原始的UITableView。如果子项下面有其他子项,则应该(单击时)使用这些选项启动另一个UITableView。还有一个后退按钮作为菜单项,允许用户导航到显示的上一个菜单。

这里的挑战是我没有使用导航控制器。原始开发人员只想将UITable Views添加到堆栈,在从一个菜单转到另一个菜单时添加它们之间的转换。我见过并尝试过的大多数教程都使用导航控制器和Interface Builder来关联UITableViews。

现在,我有一个填充菜单的XML数据源,当我点击菜单项时,标题会正确更改,但仍然使用相同的UITableView来显示选项 - 这当然会产生一些后果,因为子项目可能不适合屏幕。

有关如何做到这一点的任何想法?如果有必要,我可以发布一些代码,虽然我认为一般描述应该能够与你们中的一个聪明的人敲响一声!

2 个答案:

答案 0 :(得分:1)

爱。这将是一个艰难的。我的建议是维护自己的堆栈实现。然后,使用CoreAnimation从主视图控制器添加/删除UITableViews以获得动画效果。因此,每当用户单击当前表视图中的元素时,相应的控制器将创建一个新的控制器和表视图,然后您的自定义导航控制器将旧的推送到堆栈,从主视图中删除旧的表视图,设置新控制器作为当前控制器,并将新表视图添加到主视图中。有点凌乱,但我认为它会起作用。

答案 1 :(得分:1)

这可以通过多种方式完成。

  1. 我还没有完成第一个,但您可以创建一个UINavigationController并将其视图设置为适当的框架(在气泡内)隐藏导航栏并设置后退按钮的操作以弹出当前视图控制器。
  2. 另一种方法是在一个控制器上有多个表视图,委托和数据源方法将UITableView作为参数,以便在设置行,标题等的高度以及返回UITableViewCell时区分它们。
  3. 我选择处理此类配置的方法是使用一个UITableView并仅更改数据源。当您重新加载,插入,删除行或重新加载整个表时,您可以根据当前数据源级别更改所需的任何内容。最简单的无动画方式是重新加载整个表。

    a)如果你的“选项”离屏幕高度明智(你想要固定高度)表改变 - (CGFloat)tableview:(UITableView *)表heightForRowAtSection:(NSInteger)部分返回值

    b)如果您的“选项”在屏幕外长度方面明智,请使您的单元格的默认textLabel灵活:cell.textLabel.adjustsFontSizeToFitWidth = YES; cell.textLabel.minimumFontSize = 14;或者为每个数据源级别定制单元格(查找子类化UITableViewCell,建议使用)。

    • 如果您继承TableViewCells,请记住每个级别都有不同的出列单元格标识符,因此该表不会为您提供另一个级别的单元格类。
  4. 对于tableviews或数据源的“堆栈”,您可以使用带有addObject的NSMutableArray和用于pop的removeLastObject。 对于动画,UITableViews可以为它们的行/部分设置动画为3.(请参阅文档中的插入,删除,重新加载 - 行/部分UITableView类参考),对于2.您甚至可以使用UIView(如果不是CoreAnimation作为Grimless建议的)动画,将当前tableview向左移动(setFrame :)并从右侧移动下一个tableview(在动画之前将setFrame设置为off屏幕,然后在beginAnimation-commitAnimation子句中将其移动到位),但请确保在容器视图中添加tableviews(泡泡内部) )剪辑其子视图。