gpt4 book ai didi

iphone - viewwillappear 和 viewdidappear 未调用

转载 作者:可可西里 更新时间:2023-11-01 06:16:33 26 4
gpt4 key购买 nike

这个问题很常见,但我没有任何可用的答案来解决它。

我正在使用 iOS 5.1。我的导航 Controller 是选项卡栏 View Controller 中的一个选项卡。有一个 TableView ,其中选择一行会推送新的 View Controller 。

此问题仅在选择第二行时出现,并且仅在某些时候出现。这不是规律的。推送 View 变为空白 - viewWillAppear/viewDidAppear 未被调用。单击导航栏的后退按钮时 - Root View 的 viewWillAppear/viewDidAppear 也未被调用,使其变为空白。

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

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

我试过了thisthis但徒劳无功。

  1. viewDidLoad 在推送 BViewController 时被调用,但是,viewWillAppearviewDidAppear 不是被调用。以下是我的 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. 这不是规律的。有时我会遇到这种情况,这种情况一直持续到我从后台关闭应用程序并重新启动它。但有时它工作得很好。我只是将我的 View Controller 推送到 nab 堆栈。

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

最佳答案

您如何为 AViewControllerBViewController 定义 View ?通常你会使用 initWithNibName,例如

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

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

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

但是根据文档,您需要指定 NIB 或使用 loadView。查看View Management UIViewController 类引用中的讨论。

更新:

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

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

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

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

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

关于iphone - viewwillappear 和 viewdidappear 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12225162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com