Apple 官方文檔明確指出:當控制器的 view 互為父子關係時,控制器本身最好也建立父子關係。 違反此原則會導致嚴重的生命週期與事件傳遞問題。
場景:主控制器 ZYViewController 懶加載子控制器 ZYOneViewController,僅將其 view 添加為子視圖,未調用 addChildViewController:。
// 錯誤做法
- (IBAction)vc1 {
[self.view addSubview:self.one.view]; // 僅視圖層級父子
}
旋轉設備時,父控制器收到 willRotateToInterfaceOrientation: 等回調,但子控制器完全收不到任何旋轉事件。控制台輸出證實:只有父控制器打印了旋轉日誌。
- (ZYOneViewController *)one {
if (!_one) {
_one = [[ZYOneViewController alloc] init];
_one.view.frame = CGRectMake(10, 70, 300, 300);
[self addChildViewController:_one]; // 關鍵步驟
}
return _one;
}
添加此行後,旋轉事件正常傳遞給子控制器,雙方均打印出對應日誌。
addChildViewController: 後,若手動管理視圖層級,還需調用 [child didMoveToParentViewController:self];[child willMoveToParentViewController:nil]、[child.view removeFromSuperview]、[child removeFromParentViewController];「視圖父子 ⇒ 控制器父子」是 iOS 視圖控制器架構的基石。忽視它會導致旋轉失效、生命週期缺失、狀態恢復異常等難以排查的 Bug。養成習慣:每次 addSubview: 子控制器的 view 時,自問「addChildViewController: 了嗎?」