我正在开发一款有点像网站的应用。每个viewcontroller都有一个菜单,需要切换到正确的视图。
我的申请中没有回复的概念。因此,如果我使用UINavigation来推送视图,我最终会堆积很多视图。
同样的问题,如果我将vc作为一个孩子添加或呈现它,一段时间后你会得到数百个vcs。
我可以设计一种方法,以便在任何给定时间安全地只有1个视图?
由于
答案 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)
使用标签栏视图控制器并隐藏标签栏。
选项卡视图控制器可以有许多子视图控制器。您可以在故事板或代码中添加这些子视图控制器。
您可以使用菜单选择要显示的子视图控制器。子视图控制器的索引编号为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
控制器,并且不用担心它们指向内存的指针。