切换UINavigationController层次结构的块并保留导航栏

时间:2011-08-07 16:23:35

标签: iphone uitableview uinavigationcontroller

这有点啰嗦,但我认为更清楚。我似乎无法找到明确的方法来做到这一点,问题很微妙(我认为)。

我有一个应用程序的GUI层次结构如下所示:

  • 主列表(具有自定义TableCell和高度)
    • 子列表(对于选定的主列表项)
      • 子列表信息(在选定的子列表项上)
        • 更多信息
    • 设置(对于选定的主列表项)
      • 设置信息(在所选设置项上)
        • 更多信息

一旦选择了主列表项,用户就可以在子列表和设置之间进行交换,每个子列表和设置都有自己的GUI子层次结构。使用工具栏进行切换。

我尝试了几种方法,似乎没有什么工作正常。

首先尝试(受到其他问题的启发)

  • 的UINavigationController
    • UITableViewControllerBase(从nib加载)
      • TableViewController1(以编程方式在didSelectRowAtIndexPath上加载)
      • TableViewController2(可以从TableViewController1交换)

我在创建各种对象时传递对rootViewController的引用,然后使用它来进行切换。

[rootViewController switchViews]

在rootViewController.switchViews()中:

[TableViewController2 alloc] init];
[TableViewController1 removeFromSuperview];
[self.view insertSubview:TableViewController2.view atIndex:0]
. . .

基本上,rootViewController管理交换机。这适用于交换机,但是当我通过层次结构导航回主列表时,它不会正确初始化表格单元格。

在cellForRowAtIndexPath中:

static NSString *CellId = @"CellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIDentifier:CellId];
if (cell == nil)
{
  ... (this does not get called)
}

因为括号中的代码没有被调用,所以表视图看起来是“通用的”,也就是说,不使用自定义单元格。虽然这可能是一个无关的错误,但这里的整个方法对我来说似乎并不合适。我的理解是主动视图控制器应该处理开关。所以我尝试了不同的东西。 。

第二次尝试(受Beginning iPhone Programming book的启发):

  • 的UINavigationController
    • UITableViewControllerBase(从nib加载)
      • UIViewControllerParent(以编程方式在didSelectRowAtIndexPath上加载)
        • TableViewController1(以编程方式在父级的loadView上加载)
        • TableViewController2(可以从TableViewController1交换)

这里我们将嵌套的表视图包含在控制器父级中,并让父级完成所有工作。

在父级的loadView()中:

TableViewController1 *tvc1 = [[UITableViewController alloc] init];
self.tableViewController1 = tvc1;
[self.view insertSubview:tableViewController1.view atIndex:0];
[tvc1 release];

这里的问题是tableViewController1虽然是inited,但在插入时没有有效的视图。因此,反复调用loadView函数。 。 。我也尝试将此代码放在viewDidLoad中,同样的问题。

我从iOS开发者网站上阅读了示例代码TheElements,并且最初将采用该路线。问题是,在用户在我的应用程序中切换视图后,他可以深入了解更多屏幕。我希望所有这些屏幕都成为应用程序层次结构的一部分(这样我们就可以在需要时返回主列表)。虽然TheElements说明了一个开关,它只是在一个UIViewController中切换视图 - 我需要能够在切换到新屏幕后向下钻取并让所有这些屏幕成为UINavigationViewController层次结构的一部分,用于导航。

我对这一切都是新手,所以我可能会以错误的方式思考问题。因此问题。我确信这种设计有点普遍,所以尽管有很多方法可以做到,但我正在寻找最佳实践。这里的关键是在切换完成后,用户应该能够在UINavigationViewController的层次结构中向下导航,并能够导航回来。这需要加载多个UIViewControllers。我相信。

非常感谢时间(并为长篇文章道歉)。

1 个答案:

答案 0 :(得分:1)

因此,如果我正确理解您的问题,您需要在导航控制器堆栈顶部的两个视图控制器之间切换。为什么不让导航控制器完成工作并使用setViewControllers:animated:,只替换现有阵列中的最后一个视图控制器。

示例,附加翻转动画(在SubListViewController中):

- (void)switchToSettings:(id)sender
{
    [UIView transitionWithView:self.navigationController.view duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^ {
        SettingsViewController *settingsVC = [[[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease];
        settingsVC.mainListItem = self.mainListItem;
        NSMutableArray *mutableViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
        [mutableViewControllers removeLastObject];
        [mutableViewControllers addObject:settingsVC];
        [self.navigationController setViewControllers:mutableViewControllers animated:NO];
    } completion:^(BOOL finished) {}];
}