根据我的项目设计,导航堆栈结构如下: 启动画面 - >首页 - >活动清单 - >活动详情
现在,我使用了Url称之为“家庭”的自定义网址。页。 所以,我想改变导航堆栈结构,如下所示: 启动画面 - >家
据我所知,我的代码面临一些内存问题:
我可以编写只能到达堆栈的代码:Splash - >首页 - >首页 - >首页 - > ...。等等,每当我使用自定义网址时。
否则,使用popToviewController我可以到达堆栈,如: 启动 - >首页 - >主页
但是,推动成功发生但观点没有改变。
以下代码:
navigationArray = [[NSMutableArray alloc] initWithArray: self.nav.viewControllers];
for(int k=[navigationArray count]-1;k>=0;k--){
if ([[navigationArray objectAtIndex:k] isKindOfClass:[Home class]]){
//UIViewController *controller=[navigationArray objectAtIndex:k];
id obj=[navigationArray objectAtIndex:k];
[[self nav] popToViewController:obj animated:YES];
}
}
if(IS_IPAD)
class=[[Home alloc] initWithNibName:@"Home_iPad" bundle:Nil];
else
class=[[Home alloc] initWithNibName:@"Home" bundle:[NSBundle mainBundle]];
[self.nav pushViewController:class animated:YES];
NSLog(@"Finally, In Nav: %@", [self.nav viewControllers]);
这打印如下:
"Splash: 0xcea0c70",
"Home: 0xd193400",
"Home: 0xd470600".
即启动 - >首页 - >家即可。 但是,Simulator显示Home:0xd193400而不是Home:0xd470600。为什么呢?
答案 0 :(得分:1)
这里遇到同样的问题...但我不知道这是为什么这样做...所以我已经完成了这个技巧,你也可以申请
navigationArray = [[NSMutableArray alloc] initWithArray: self.nav.viewControllers];
for(int k=[navigationArray count]-1;k>=0;k--){
if ([[navigationArray objectAtIndex:k] isKindOfClass:[Home class]]){
//UIViewController *controller=[navigationArray objectAtIndex:k];
id obj=[navigationArray objectAtIndex:k];
[[self nav] popToViewController:obj animated:YES];
}
}
[self performSelector:@selector(pushViewController) withObject:nil afterDelay:.60];
- (void)pushViewController
{
if(IS_IPAD)
class=[[Home alloc] initWithNibName:@"Home_iPad" bundle:Nil];
else
class=[[Home alloc] initWithNibName:@"Home" bundle:[NSBundle mainBundle]];
[self.nav pushViewController:class animated:YES];
NSLog(@"Finally, In Nav: %@", [self.nav viewControllers]);
}
2。溶液
如果您在后台线程中运行此方法
然后使用这个
[self performSelectorOnMainThread:@selector(pushViewController) withObject:nil waitUntilDone:NO];
答案 1 :(得分:1)
这些都是线程的概念。由于信号量概念下的一些线程块,pop已经完成但是即使它被分配也没有发生。所以,@ Dharmbir的答案对于避免OP提出的导航问题非常有用。遵循@Dharmbir的想法后,OP将面临许多其他问题。
例如,
原因:'无法将自己添加为子视图'
“Home:0xe671800”的开始/结束外观转换的不平衡调用
为避免上述错误,我们必须遵循以下其他Stack Overflow用户提供的建议。