【问题标题】:viewwillappear and viewdidappear not called未调用 viewwillappear 和 viewdidappear
【发布时间】:2012-08-26 20:25:34
【问题描述】:

这个问题很常见,但我无法通过任何可用的答案来解决它。

我正在开发 iOS 5.1。我的导航控制器是标签栏视图控制器中的一个标签。有一个表格视图,其中选择一行会推送新的视图控制器。

此问题仅在选择第二行时发生,并且仅在某些情况下发生。这不正常。 Pushed 视图变为空白 - viewWillAppear/viewDidAppear 未被调用。单击导航栏的后退按钮 - 根视图的 viewWillAppear/viewDidAppear 也没有被调用,使其空白。

我正在以完全相同的方式推送第一行/第二行的选择视图。但问题只出现在第二行。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    switch (indexPath.row) {
        case 0:
            AViewController *aObj = [[AViewController alloc] init];
            aObj.homeObj = self;
            [self.navigationController pushViewController:aObj animated:YES];
            [aObj release];
            break;
        case 1:
            BViewController *bVCObj = [[BViewController alloc] init];
            bVCObj.homeObj = self;
            [self.navigationController pushViewController:bVCObj animated:YES];
            [bVCObj release];
            break;
        default:
            break;
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

我尝试过this 和this,但没有成功。

  1. viewDidLoad 在推送BViewController 时被调用,但是viewWillAppear 和viewDidAppear 未被调用。以下是我的viewDidLoad:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor blackColor];
        NSLog(@"nav stack: %@", [self.navigationController viewControllers]);
        NSLog(@"nav stack: %@", [[self.navigationController visibleViewController] description]);
        //some initialization and call of methods
    }
    
  2. 这不正常。有时我会遇到这种情况,这种情况一直持续到我从后台关闭应用程序并重新启动它。但有时它工作得很好。我只是将视图控制器推送到 nab 堆栈。

  3. 正如我在评论中提到的,它是标签栏控制器中的常规导航控制器。

【问题讨论】:

  • “我的导航控制器位于标签栏控制器的视图控制器内”是什么意思。 navcontroller 应该是 TabBar 视图控制器之一,您不需要将它包装在另一个 viewController 中。
  • 我的意思是导航控制器作为标签栏控制器的一部分。 :)

标签: iphone ios uinavigationcontroller uitabbarcontroller viewwillappear


【解决方案1】:

您如何定义您对AViewController 和BViewController 的看法?通常你会使用initWithNibName,例如

AViewController *aObj = [[AViewController alloc] initWithNibName:@"mynibname" bundle:nil]`

正如 Carl 指出的那样,您显然可以只使用 init(尽管我在 UIViewController Class Reference 中没有看到这一点),但是系统会非常注意您的 NIB 文件的名称。但是,文档确实说,您可以使用initWithNibName 并为NIB 名称传递nil,在这种情况下,它会尝试为您找到它。不过,就个人而言,如果您的结果不一致,我会尝试使用 initWithNibName 并明确传递您的 NIB 的名称,看看是否可以纠正这种情况。

或者您是否在两个控制器中使用loadView 以编程方式构建您的视图?然后你需要向我们展示那些loadView 例程(不要与viewDidLoad 混淆)。

但根据文档,您需要指定您的 NIB 或使用loadView。请参阅UIViewController 类参考中的View Management 讨论。

更新:

根据您的反馈,我有几个想法:

  1. 不用说,问题显然与上述代码无关。您需要扩大搜索范围并向我们展示更多代码。也许向我们展示你的viewDidLoad B?

  2. 通常当您没有收到此类事件时,这是因为视图控制器层次结构与视图层次结构不同步。人们这样做的最常见方式是,如果他们在某个时候做了类似“[addSubview someNewController.view]”之类的事情。如果您在任何上下文中使用视图控制器,而不是 (a) 您的应用程序委托的初始配置; (b)presentViewController(或解雇);或 (c) pushViewController(或 pop),那么您可能想分享您所做的事情。

  3. 正如 andreamazz 所指出的,您的评论“我的导航控制器位于选项卡栏控制器的视图控制器内”,如果从字面上阅读它会有点令人不安。您可以将导航栏放在视图控制器的视图中,但不能将导航控制器放在视图控制器中(除非您正在执行视图控制器包含,这是一个完全不同的野兽)。同样令人担忧的是,在您的另一个问题中,您说:“在 UIViewController 中嵌入 UINavigationController 或 UITabBarController(我的情况)会以某种方式中断这些方法的调用。”问题是,您不会将导航控制器嵌入到其他视图控制器中(除非它本身就是一个容器控制器,例如选项卡视图控制器),而是相反。但是如果你的字面意思是你有一个包含导航控制器的控制器,你必须向我们展示你是如何做到的(正确的视图控制器包含?)因为这是非常不寻常的。

  4. 这很不寻常,但我有一些项目被破坏,最终处于奇怪的状态。至少,我可能会建议“产品”-“清洁”并重建。如果问题仍然存在,并且您已将问题隔离到 B 的 NIB,则暂时重命名它并从头开始构建一个快速而肮脏的。

【讨论】:

  • init 方法将调用 initWithNibName:bundle: 传递类名和主包的 nib 名称,如果通过 Xcode 对话框添加 OP,它们的 nib 可能与类同名。因此,在不实现 loadView 的情况下提供 nib 名称并不是绝对必要的。但值得一试的是,OP 确实遵循了这个约定!
  • 我不知道。我没有看到 UIViewController 类参考中记录的内容,但我会相信你的话。我知道,如果您调用 initWithNibName 并传递 nil 作为笔尖名称,它会按照您的描述进行,但我不知道 init 也会这样做。
  • 我正在使用 nib 加载视图。我尝试使用 intwithNibname。但它仍然不起作用。
  • @Rob: viewDidLoad 在推送 BViewController 时被调用,但是 viewWillAppear 和 viewDidAppear 没有被调用。
  • @Rob :你找到解决方案了吗?我仍然无法解决这个问题..这种情况很少发生......但这仍然不是一件好事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2011-05-19
相关资源
最近更新 更多