自定义UITabBarController moreNavigationController

时间:2010-12-08 15:33:28

标签: iphone objective-c cocoa-touch uitabbarcontroller

我正在我的应用程序的UITabBarController中自定义“更多”视图。

从我在文档中看到的内容中,很少有人支持自定义它。 UITabBarController只有一个名为'moreNavigationController'的只读属性,它指向UINavigationController。

这使我们至少可以自定义它的UINavigationBar。自定义它在第一个视图控制器中显示的表视图有点棘手。

关于SO和其他地方的其他问题,我看到所有的讨论都围绕着搞乱moreNavigationController的内部结构(例如观察堆栈中的第一个视图控制器是UITableViewController,交换它的数据控制器)等)。问题是所有这些方法都假设API中未记录的代码如何表现,这些假设几乎没有面向未来。

我在这里看到的唯一选择是滚动我自己的自定义“更多控制器”(可选地放弃编辑功能以保持实现相当简单)并将其用作选项卡中的第五个视图控制器。当然必须注意将后续视图控制器分配给自定义“更多控制器”而不是直接分配给UITabBarController(可能需要对UITabBarController进行子类化以强制执行此规则)。

您会选择哪种方法?你会建议其他什么解决方案?

2 个答案:

答案 0 :(得分:4)

我会选择推出自己的自定义控制器有三个原因:

  1. moreViewControllerUIKit控制。在外部,很难自定义一些视图并直接控制它们。 moreViewController中会有不可预测的方法和图层定义。它不能是基本UITableViewController。我认为自定义具有委托的类更有效。

  2. 如果您自定义moreViewController,则每次Apple发布新iOS时,您可能必须发布新版本的应用。 Apple的moreViewController开发人员可能会将整个课程改为其他课程。因此,您的申请将停止响应。

  3. 我自己的班级,我自己的家。我可以做任何我想做的事。

答案 1 :(得分:4)

UIViewController *tbMore = 
    ((UIViewController*)
    [self.moreNavigationController.viewControllers objectAtIndex:0]);

int nRows = [((UITableView *)tbMore.view) numberOfRowsInSection:0];

for (int i = 0; i < nRows; i++)
{
    UITableViewCell *c =
        [((UITableView *)tbMore.view)
        cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];

    // Do any additional customization here!
}