1

我在管理我的应用程序中的视图时遇到了困难,如果有人提供一些说明,我将不胜感激。在我看来,该程序按以下方式构建为层次结构。

    BNG_AppViewController:UIViewController  

-通话-

    NameListSelectionController:UIViewContoller

-通话-

    GameViewController:UIViewController

-通话-

    NameResultsController:UIViewController

使用接口构建器中的 XIB 构建的所有子视图都以与以下相同的方式调用:

    NameListSelectionController *NameListSelectionControllerScreen = [[NameListSelectionController alloc] initWithNibName:@"NameListSelectionController" 
              bundle:nil];
    [self.view addSubview:NameListSelectionControllerScreen.view];

当我想向上移动视图层次结构时,我在控制器类中使用与以下相同的调用——通常使用按钮来触发调用。

    [self.view removeFromSuperview];

使用这种方法,我可以以线性方式上下移动我的层次结构。

但是,我希望能够做的是,当我回到我的层次结构时,跳过第二级控制器(即上面的 NameListSelectionController)并直接从第三级转到第一级。

到目前为止,我尝试在沿层次结构向下调用我的第三级时从层次结构中删除第二级视图,但无济于事。

    [self.view removeFromSuperview];
    gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
    [self.view addSubview:gameScreen.view];

然而,我似乎最终回到了我的第一级,对代码的第二行和第三行没有任何明显的影响。我还尝试将层次结构的第二级发送到后面,但没有任何结果。

我将不胜感激任何正确方向的指针,包括任何关于如何修改我的程序结构的大图想法。我需要以上述线性方式指导用户,但我不知道我需要以这种方式构建程序。

我确实阅读了所有关于子视图的文档和我能找到的 removeFromSuperview 调用,但没有看到做我想做的事情的方法,或者我不明白我读到的内容。我确实研究了使用 NavigationController 的可能性,但考虑到我正在尝试做的事情(或者我可能看不到它们),这似乎并没有提供任何优势。

4

3 回答 3

1

为此,您可以使用导航控制器。
当您想跳过一个弹出窗口时,您可以使用-[UINavigationController popToRootViewControllerAnimated:]-[UINavigationController popToViewController:animated:]来完成此操作。

-(void)goToMainCategoryView;
{
    id object = nil;

    for (UIViewController *viewControl in self.navigationController.viewControllers)
    {
        if(viewControl.view.tag == 0)
        {
            object = viewControl;
        }
    }
    [self.navigationController popToViewController:object animated:YES];
}
于 2012-01-13T09:58:34.580 回答
0

你在这方面遇到问题吗

[self.view removeFromSuperview];
gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
[self.view addSubview:gameScreen.view];

您当前的视图没有被删除,或者您的下一个视图不会使用此代码显示?如果是,那么您可以使用它

for (UIView *view in self.view.subviews) {
        if ([view isKindOfClass:[BNG_AppViewController class]] || [view isKindOfClass:[NameListSelectionController class]] || [view isKindOfClass:[NameResultsController class]]) {
            [view removeFromSuperview];
        }
    } 

从 superview 中删除视图,然后添加这个

gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil];
    [self.view addSubview:gameScreen.view];
于 2012-01-13T05:30:50.467 回答
0

里面有很多问题,没有看到整个程序,很难准确回答,但我会给出一些一般性的建议。

在内存管理上,如果您使用 ARC(自动引用计数),则不会泄漏任何内容。如果不是,则每次分配初始化 UIView 并添加为子视图时都会泄漏,而随后在该视图上调用“释放”。当您将 UIView 添加为子视图时,父视图会保留它,因此您作为调用者可以自由地调用释放它而不必担心它被释放。

看起来您想要完全按照 UINavigationController 的设计用途,在层次结构中呈现一系列视图。它允许您向堆栈中的任何视图推送/弹出/弹出,并为您跟踪所有视图。在我看来,这将是您在这里的最佳选择。

于 2012-01-13T05:07:51.447 回答