awakeFromNib 被调用,viewDidLoad 未被调用

Posted

技术标签:

【中文标题】awakeFromNib 被调用,viewDidLoad 未被调用【英文标题】:awakeFromNib is called, viewDidLoad is not called 【发布时间】:2015-09-24 07:52:44 【问题描述】:

我有一个从多个地方调用的视图控制器,第一次调用时,调用了 awakeFromNib,但未调用 viewDidLoad。每次都会调用 viewWillAppear 和 viewDidAppear。

此外,视图(UITableView 子类)正常运行,除了 viewDidLoad 中的任何内容显然没有实现。

loadView 在这个视图控制器中没有被覆盖。

用于覆盖 viewDidLoad 和 awakeFromNib 的代码:

- (void)awakeFromNib

// Configure for self sizing cells:
 self.tableView.estimatedRowHeight = 44;
 self.tableView.rowHeight = UITableViewAutomaticDimension;

 self.tableView.allowsSelectionDuringEditing = YES;
 self.clearsSelectionOnViewWillAppear = NO;

 self.navigationItem.title = nil;
 self.navigationItem.rightBarButtonItem = nil;
 printf("\n awake from nib \n \n ---------- \n");


- (void)viewDidLoad

 [super viewDidLoad];
 self.navigationItem.rightBarButtonItem = self.editButtonItem;
 self.tableView.allowsSelectionDuringEditing = YES;

怎么可能调用了 awakeFromNib 而没有调用 viewDidLoad,我该如何解决?

编辑:我收到了一个帮助修复它的答案,但是我想知道它为什么会发生,因为它可能与我的应用程序中的错误有关。

谢谢。

【问题讨论】:

请为这些方法添加代码。并且代码也是视图被初始化的地方。 @Rage 添加了代码。视图控制器在许多地方以及情节提要中都被实例化了,所以我不认为这是问题 我认为它不会解决您的问题,但您应该在覆盖中调用 [super awakeFromNib]; @NitzanR 如果视图控制器在许多地方被实例化,那么它可能就是问题所在。 viewDidLoad 可能比其他方法更早调用。 然后视图在 vc 之前被唤醒,vc 的 setView 被调用,但由于它还没有被唤醒,它还没有调用 viewDidLoad,而是推迟它直到它被唤醒。如果没有超级电话,它永远不会知道:) q.e.d. ;) 【参考方案1】:

这在a comment 中有点像在黑暗中刺伤,但事实证明它解决了这个问题。

确保在被覆盖的方法中调用[super awakeFromNib]

【讨论】:

视图在 vc 之前被唤醒,vc 的 setView 被调用但由于它还没有被唤醒,它还没有调用 viewDidLoad 而是推迟到它被唤醒。如果没有超级电话,它永远不会知道:) q.e.d. ;) -- 解释为什么这样做

以上是关于awakeFromNib 被调用,viewDidLoad 未被调用的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa - awakeFromNib 没有被调用

awakeFromNib 被多次调用

以编程方式加载 nib2 时,来自 nib1 的 awakeFromNib 被调用

awakeFromNib() 在滚动开始时在 UICollectionViewCell 子类中调用了两次

awakeFromNib 没有调用但显示 xib

awakeFromNib() 调用了两次