在没有无限堆叠它们的情况下呈现新的视图控制器?

时间:2014-07-20 23:29:22

标签: ios objective-c

我正在开发一款有点像网站的应用。每个viewcontroller都有一个菜单,需要切换到正确的视图。

我的申请中没有回复的概念。因此,如果我使用UINavigation来推送视图,我最终会堆积很多视图。

同样的问题,如果我将vc作为一个孩子添加或呈现它,一段时间后你会得到数百个vcs。

我可以设计一种方法,以便在任何给定时间安全地只有1个视图?

由于

3 个答案:

答案 0 :(得分:1)

喜欢这个。

将此添加到有权访问导航控制器的所有控制器。如果要推送新控制器,而不是使用pushViewController:animated,则可以使用此控制器。您可以修改代码以将animated作为参数。

- (void)pushIfNotInStack:(UIViewController*)viewController
{
    BOOL isInStack = NO;
    NSMutableArray * vcStack = [self.navigationController.viewControllers mutableCopy];
    for (NSInteger i = 1 ; i <vcStack.count; i++){
        if ([viewController isKindOfClass:[[vcStack objectAtIndex:i]class]]) {
            [vcStack replaceObjectAtIndex:i withObject:viewController];
            isInStack = YES;
        }
    }

    if(isInStack){
        [self.navigationController setViewControllers:vcStack];
        [self.navigationController popToViewController:viewController animated:YES];
    } else {
        [self.navigationController pushViewController:viewController animated:YES];
    }
}

答案 1 :(得分:0)

使用标签栏视图控制器并隐藏标签栏。

选项卡视图控制器可以有许多子视图控制器。您可以在故事板或代码中添加这些子视图控制器。

enter image description here

您可以使用菜单选择要显示的子视图控制器。子视图控制器的索引编号为0到n - 1,其中n是视图控制器的数量。如果要在索引i处显示视图控制器:

[self.tabBarController setSelectedIndex:i];

不要忘记隐藏每个子视图控制器中的标签栏viewDidLoad

答案 2 :(得分:0)

您还可以对UINavigationController class进行子类化并覆盖pushViewController:animated:方法,如下所示:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if (self.viewControllers.count > <#the number of controllers you want to keep in memory eg. 20 #>) {
        NSMutableArray *mutableViewControllers = [self.viewControllers mutableCopy];
        //remove 2 last controllers in controller stack (from the bottom)
        [mutableViewControllers removeObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)]];
        self.viewControllers = [mutableViewControllers copy];
    }

    [super pushViewController:viewController animated:animated];
}

这种方法以正常方式保证你alloc init控制器,并且不用担心它们指向内存的指针。