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

iOS Storyboard 傳遞導航欄標題到下一頁:正確傳值模式

     編輯:程式設計綜合問答

問題現象

嘗試在第一頁按鈕點擊時,直接修改第二頁 UINavigationBar outlet 的 topItem.title,但第二頁尚未載入導致崩潰或無效果。

錯誤寫法

// 第一頁
- (IBAction)ChangeSecondPageTitle:(id)sender {
    SecondViewController *second = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    second.detailTitle.topItem.title = @"example";  // 錯誤:detailTitle 尚未連接,topItem 為 nil
    [self presentModalViewController:second animated:YES];
}

核心原則:資料傳遞而非視圖操作

遵循 MVC:第一頁傳遞「標題字串」模型資料,第二頁在 viewDidLoad 套用到視圖。

正確實現(Storyboard + Segue 推薦)

方法一:使用 Segue(最符合 Storyboard 設計)

// 第一頁:準備轉場傳值
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        SecondViewController *vc = segue.destinationViewController;
        vc.navBarTitle = @"example";  // 傳遞字串屬性
    }
}

// 第二頁:接收並套用
@property (strong, nonatomic) NSString *navBarTitle;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = self.navBarTitle;  // 自動設定 navigationItem.title
}

方法二:程式碼實例化 + 屬性注入

// 第一頁
- (IBAction)ChangeSecondPageTitle:(id)sender {
    SecondViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"second"];
    vc.navBarTitle = @"example";
    // 若在 NavigationController 中:
    [self.navigationController pushViewController:vc animated:YES];
    // 或模態呈現:
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
    [self presentViewController:nav animated:YES completion:nil];
}

// 第二頁同方法一

關鍵點總結

  • 勿在目標 VC view 載入前操作其視圖屬性(outlet 尚未連接)。
  • 傳遞模型資料,由目標 VC 自行決定如何呈現。
  • 使用 self.title 或 self.navigationItem.title 設定導航標題,系統自動處理 navigationBar 顯示。
  • 模態呈現需包 NavigationController 才會有導航列。

掌握「資料下傳、視圖自繪」的單向流,是 iOS 畫面轉場傳值的基石。

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