【问题标题】:Push Successful! But, View not change! - Why?推送成功!但是,观点不变! - 为什么?
【发布时间】:2026-02-15 17:50:02
【问题描述】:

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

现在,我使用 URL 称为“主页”页面的自定义 URL。 所以,我想改变导航堆栈结构,如下所示: 启动画面 -> 主页

据我所知,我的代码面临一些内存问题:

  • 我可以编写只能到达堆栈的代码,例如:Splash -> Home -> Home -> Home -> ...。等等,每当我使用自定义网址时。

  • 否则,使用 popToviewController 我可以像这样到达堆栈: Splash -> 主页 -> 主页

但是,推送成功了,但是视图没有改变。

代码如下:

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".

Splash -> Home -> Home。 但是,模拟器显示 Home:0xd193400 而不是 Home:0xd470600。为什么?

【问题讨论】:

  • 您的问题不清楚。我认为如果你能重新表述你的问题会更好。
  • 在您推送编辑列表视图控制器的位置添加您的代码
  • 请查看我发布的代码,并回答我任何你知道的问题。
  • @Naga OP 在帖子末尾清楚地提出了一个问题。推送发生了,但未显示推送的视图。 IE。显示“主页:0xd193400”而不是“主页:0xd470600”。我不知道为什么会这样。
  • @UdanPirappu,这就是为什么我要求他提供更多信息。他只是要求通过查看他发布的代码来给出答案。如果你明白什么是问题,你可以向我解释。另请解释这是什么意思“显示“主页:0xd193400”而不是“主页:0xd470600”

标签: objective-c ios7


【解决方案1】:

这些都属于线程的概念。由于信号量概念下的一些线程块,弹出完成但即使分配也没有发生推送。因此,@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

【讨论】:

    【解决方案2】:

    这里面临同样的问题......但我不明白为什么会这样......所以我已经完成了这个技巧,你也可以申请

    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];
    

    【讨论】: