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 未被调用的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式加载 nib2 时,来自 nib1 的 awakeFromNib 被调用