【问题标题】:uinavigationcontroller back button reloads the current loaded screenuinavigationcontroller 后退按钮重新加载当前加载的屏幕
【发布时间】:2011-07-23 12:22:05
【问题描述】:

在为 iphone 开发应用程序时,我的代码中有一个奇怪的错误。我正在创建一个导航控制器并将其放在我的标签栏控制器中,然后当我从初始屏幕移动到辅助屏幕时,辅助屏幕上的后退按钮指向自身。所以当按下返回时它只会重新加载自己,然后下次按下它会返回到第一个屏幕。

UINavigationController *nav1 = [[UINavigationController alloc] init];

// create the initial views for each nav controller
SearchViewController *searchView = [[SearchViewController alloc] init];
searchView.title = @"Search";


//place all the viewcontrollers on the nav controllers ready to view
[nav1 pushViewController: searchView  animated:NO];


//create tab bar out of above nav controllers

UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Search" image:[UIImage imageNamed:@"search.png"] tag:0];
nav1.tabBarItem = item;

UITabBarController *tbc = [[UITabBarController alloc] init];
        tbc.viewControllers = [NSArray arrayWithObjects:nav1, nil];
    //    
[nav1 release];

以上代码在 appdelegate 中,用于初始设置 nav + tab 控制器

SecondScreenViewController *sVC = [[SecondScreenViewController alloc] init];

sVC.title = @"Screen 2";
[self.navigationController pushViewController:sVC animated:YES];
[sVC release];

上面是将第二个屏幕/视图控制器加载到导航控制器的搜索视图控制器中的代码。但是屏幕 2 顶部的后退按钮中包含单词 screen 2,当我按下它时它会重新加载,然后后退按钮显示搜索(这是第一个屏幕的标题)。这次按下它会回到第一个屏幕。

我只是很困惑为什么后退按钮会显示视图控制器自己的标题名称并重新加载自己。我在这些屏幕中真的没有任何其他代码,它们只是空白屏幕,带有标签显示哪个屏幕在那里,而我正在学习如何正确使用它

【问题讨论】:

  • 正如有人在我的一个问题中向我指出的那样,您可以使用 self.navigationController.viewControllers 来查看导航堆栈中的实际内容。也许那里发生了一些可疑的事情。
  • 为小费干杯。这表明我的第二个视图控制器以某种方式被加载了两次。现在去追踪它

标签: iphone objective-c interface-builder


【解决方案1】:

在 Apple Docs 中为 UINavigationController 指定初始值设定项

- (id)initWithRootViewController:(UIViewController *)rootViewController

据说:

每个导航堆栈必须至少有一个视图控制器作为根。

我建议尝试使用 rootViewController 初始化您的 UINavigationController

【讨论】:

    【解决方案2】:

    TiltedWindmill,我以前遇到过这个问题。就我而言,在我的脑海中,我想这样做:

    ( > = 推送视图控制器)

    从 MapViewController 开始 > 关于地图上单击的 pin 的 Attraction 的详细信息 > MapViewController > 然后推送另一个 DetailsViewController。

    在我的 MapViewController 中,此视图控制器已注册用于通知。从理论上讲,我认为我正在像这样导航地图 > 详细信息视图控制器 > 地图 > 详细信息视图控制器。问题是,每当我点击地图上的图钉时,就会触发通知,并且导航堆栈上的 MapViewController 的两个副本都会响应通知。

    因此,它推送了同一个 DetailsViewController 的两个副本。所以真正的导航是这样的:

    Map > Details View Controller > Map > Details View Controller copy1 + DetailsViewController copy2

    *> = 第二个细节视图控制器被推到前一个控制器之上,但肉眼不可见。

    当我按下返回按钮时,它弹出 DetailsViewController copy2 并显示相同的视图控制器(DetailsViewController copy1)。

    我通过告诉我的 MapViewController 取消订阅事件 viewDidDisappear 的通知来修复它。

    不知道你是否理解:P

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多