首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 從 Storyboard 實例化 ViewController 獲取 View 與手動 alloc/init 區別解析

     編輯:程式設計綜合問答

現象對比

// 方式一:Storyboard 實例化 -> 可見 View
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"meterEnlarge"];
return vc.view; // 正常顯示

// 方式二:手動 alloc/init -> 空白 View
ViewController_Meter_Enlarge_iPad *vc = [[ViewController_Meter_Enlarge_iPad alloc] init];
return vc.view; // 空白/不顯示

根本原因

Storyboard 實例化會自動加載關聯的 View(Nib/Storyboard 場景),而 alloc/init 僅創建控制器對象,不會自動加載 View**,除非重寫 loadView 或有同名 .xib 文件。

View 加載機制

  1. init → 不加載 View
  2. 首次訪問 view 屬性 → 觸發 loadView
  3. loadView 默認行為:
    • 若有同名 .xib (繼承自 UIViewController) → [[NSBundle mainBundle] loadNibNamed:...]
    • 若無 xib → 創建空白 UIView (frame=CGRectZero)
    • 若繼承自 UITableViewController → 創建 UITableView
  4. viewDidLoad → View 加載完成回調

修正手動創建方式

方案一:指定 Nib 名稱初始化(推薦)

ViewController_Meter_Enlarge_iPad *vc = [[ViewController_Meter_Enlarge_iPad alloc] 
    initWithNibName:@"ViewController_Meter_Enlarge_iPad" bundle:nil];
return vc.view; // 正確加載 xib 視圖

方案二:重寫 loadView 手動構建 View(純代碼佈局)

@implementation ViewController_Meter_Enlarge_iPad
- (void)loadView {
    self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.view.backgroundColor = [UIColor whiteColor];
    // 純代碼添加子視圖、約束...
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
    [btn setTitle:@"Test" forState:UIControlStateNormal];
    [self.view addSubview:btn];
    // 添加 AutoLayout 約束...
}
@end

方案三:Storyboard ID 實例化(最常用)

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController_Meter_Enlarge_iPad *vc = [sb instantiateViewControllerWithIdentifier:@"MeterEnlargeVC"];
return vc.view;

避坑指南

  • 手動 alloc/init 視為「未加載 View 狀態」,訪問 view 會觸發默認空白 View 創建。
  • 若控制器來自 Storyboard,**必須**用 instantiateViewControllerWithIdentifier:,否則 segues、outlets、layout 全部失效。
  • initWithNibName:bundle: 與 init 區別:前者指定 xib,後者依賴同名約定。

理解 ViewController 視圖加載生命周期,區分 Storyboard/Nib/代碼三種創建模式,是 iOS 界面開發核心基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved