推动成功!但是,观看不变! - 为什么?

时间:2014-07-15 11:30:16

标签: objective-c ios7

根据我的项目设计,导航堆栈结构如下: 启动画面 - >首页 - >活动清单 - >活动详情

现在,我使用了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。为什么呢?

2 个答案:

答案 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用户提供的建议。

Can't add self as subview

iOS app error - Can't add self as subview

"Unbalanced calls to begin/end appearance transitions for DetailViewController" when pushing more than one detail view controller