添加和删​​除系列中的子视图

时间:2012-01-13 02:37:04

标签: iphone objective-c ios xcode subviews

我在管理我的应用中的观点时遇到了困难,并且非常感谢任何提供一些澄清的人。在我看来,程序按以下方式构建为层次结构。

    BNG_AppViewController:UIViewController  

-calls -

    NameListSelectionController:UIViewContoller

-calls -

    GameViewController:UIViewController

-calls -

    NameResultsController:UIViewController

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

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

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

    [self.view removeFromSuperview];

使用这种方法,我可以线性方式上下移动。

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

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

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

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

我很欣赏正确方向的任何指示,包括如何修改我的程序结构的任何重要想法。我需要以上述线性方式引导用户,但我不知道我需要以这种方式构建程序。

我确实阅读了有关子视图和我可以找到的removeFromSuperview调用的所有文档,但没有看到做我想要的方法或者我不理解我读的内容。我确实研究过使用NavigationController的可能性,但考虑到我试图做的事情(或者我看不到它们),这似乎没有任何好处。

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

在那里有很多问题而且没有看到整个程序,很难准确地回答它们,但是我会给出一些一般的建议。

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

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

答案 2 :(得分: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];