这有点啰嗦,但我认为更清楚。我似乎无法找到明确的方法来做到这一点,问题很微妙(我认为)。
我有一个应用程序的GUI层次结构如下所示:
一旦选择了主列表项,用户就可以在子列表和设置之间进行交换,每个子列表和设置都有自己的GUI子层次结构。使用工具栏进行切换。
我尝试了几种方法,似乎没有什么工作正常。
首先尝试(受到其他问题的启发)
我在创建各种对象时传递对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的启发):
这里我们将嵌套的表视图包含在控制器父级中,并让父级完成所有工作。
在父级的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。我相信。
非常感谢时间(并为长篇文章道歉)。
答案 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) {}];
}