蘋果開發中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么關系以及邏輯?優雅草卓伊凡

蘋果開發中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么關系以及邏輯?優雅草卓伊凡

引言

由于最近有個客戶咨詢關于 蘋果內購 in-purchase 的問題做了付費咨詢處理,得到問題:“昨天試著把您的那幾部分code 組裝成一個 project, 并運行了一下,出現了不少問題。總結如下,請您指教了。”

  1. 我原來的項目都是用 single storyboard 的模版做的,沒有像現在這樣組裝過 project,所以首先不知組裝的project 是否正確。我把 弄好的 project 附在后面了,請您幫助看下,看運行的情況是否正常。

這里我們需要知道 什么是single storyboard

好的,我們來詳細解釋一下 “single storyboard” 這個概念。

在軟件開發,特別是 iOS 應用開發 的上下文中,“single storyboard” 指的是一種使用 單個 Storyboard(故事板)文件 來設計和管理整個應用程序所有用戶界面(UI)和界面之間導航流程的架構方法。

這與使用 多個 storyboard 或將 storyboard 與純代碼創建界面相結合 的方法形成對比。


1. 什么是 Storyboard?

首先,快速回顧一下 Storyboard 是什么:

  • 可視化工具:Storyboard 是 Xcode 集成開發環境中的一個可視化畫布。
  • 表示屏幕(ViewController):你可以在上面拖放各種UI組件(如按鈕、標簽、表格)來構建一個個的視圖控制器(View Controller)。
  • 表示流程(Segue):它還能展示不同屏幕之間的轉換關系(通過 Segue 連接),讓你清晰地看到整個App的用戶流。

2. Single Storyboard 的特點

  • 一個文件管理所有:整個應用程序的每一個界面(例如:登錄頁、主頁、設置頁、詳情頁)都集中在同一個 .storyboard 文件中。
  • 直觀的整體流程:開發者可以一眼看遍所有界面以及它們是如何跳轉的,對于小型項目來說,這非常易于理解和上手。
  • Apple 早期的默認模板:在 Xcode 的早期版本中,創建新項目時默認就是使用 single storyboard(比如 Main.storyboard),這使其成為許多初學者的入門選擇。

3. 優點

  1. 簡單直觀:對于頁面數量不多的小型應用來說,管理和查看所有界面非常方便。無需在多個文件之間切換。
  2. 易于學習:非常適合初學者,可以快速通過拖拽搭建出完整的App原型,理解界面間的導航邏輯。
  3. 可視化導航:所有頁面流(Segues)都在一個文件里清晰可見,降低了理解代碼中導航邏輯的復雜度。
  4. 快速原型開發:在項目初期或制作演示原型時,可以極快地構建出完整的用戶流程。

4. 缺點(也是為什么現在不常被推薦用于大型項目的原因)

  1. 嚴重的協作沖突:這是最大的問題。因為所有界面都在一個文件里,當多個開發者同時修改這個 storyboard 時,極易發生 git 合并沖突。這個沖突文件是XML格式,幾乎無法手動解決,通常需要靠隊友回退修改,非常耗時。
  2. 性能問題:當一個 storyboard 包含大量視圖控制器時,Xcode 打開、編輯和渲染它的速度會變得非常慢,影響開發效率。
  3. 難以模塊化/組件化:無法按功能模塊將界面分離,所有東西都耦合在一起。如果想重用某個功能的界面集,會非常困難。
  4. 責任不清晰:在大型團隊中,很難界定哪個開發者負責哪一部分的界面,因為大家都工作在同一個文件上。

5. 現代最佳實踐和替代方案

由于上述缺點,特別是協作問題,現代iOS開發中對于中型及以上項目,通常不再使用 single storyboard。

常見的替代方案包括:

  1. Multiple Storyboards (多個故事板)
    • 將應用按功能模塊拆分成多個 storyboard 文件。例如:Login.storyboardHome.storyboardProfile.storyboard
    • 大大減少了git沖突,不同開發者可以負責不同模塊的storyboard。
    • 使用 UIStoryboard(name: "Name", bundle: nil).instantiateViewController(...) 來加載特定故事板中的視圖控制器。
  1. Storyboard + XIB 組合
    • 使用一個主 storyboard 作為基礎,同時結合一些XIB文件來創建獨立的、可重用的視圖或視圖控制器。
  1. 純代碼布局(Programmatic UI)
    • 完全不使用 Storyboard 或 XIB,所有界面都用代碼(如 Swift 或 Objective-C)來創建和約束(常用 SnapKit 或原生 NSLayoutConstraint)。
    • 優點:完全避免任何界面文件的沖突;精確的版本控制(diff清晰);可讀性強;易于實現復雜的動態布局。
    • 這是目前很多大型公司和團隊推崇的方式,但學習曲線相對較陡。
  1. SwiftUI
    • Apple 推出的新一代聲明式UI框架。它完全摒棄了 Storyboard 和 Interface Builder
    • 界面用 Swift 代碼聲明,預覽畫布會實時更新。它天生就解決了 Storyboard 的協作和性能問題,是Apple未來的發展方向。

總結

Single Storyboard 是一種將所有界面集中在一個故事板文件中的UI構建方法。它簡單易學,適合初學者和小型個人項目。但由于其致命的協作沖突和性能問題,在專業的、多人協作的中大型項目中已被視為一種反模式(Anti-Pattern)

現代iOS開發更傾向于使用 Multiple Storyboards純代碼SwiftUI 來構建應用程序。

好的,這是一個非常好的問題,因為它觸及了iOS開發中兩個完全不同維度的概念。將它們進行對比,能幫助你更深刻地理解iOS開發的架構和演變。

“Single Storyboard”“Objective-C語言開發” 之間的區別,本質上是 “UI構建方法”“編程語言” 的區別。它們不是一個層面的東西,因此不能直接比較孰優孰劣,而是需要理解它們如何協同工作。

我們可以用一個簡單的比喻來開場:

  • Objective-C 就像是 建筑材料(如水泥、鋼筋、磚頭),決定了建筑的結構和強度。
  • Storyboard 就像是 建筑圖紙和室內設計圖,決定了建筑的外觀、布局和房間之間的連接。

你可以用 同一種材料(Objective-C 或 Swift),按照 不同的圖紙(Single Storyboard, Multiple Storyboards, 純代碼)來建造房子。


概念維度對比

特性維度

Single Storyboard

Objective-C

本質

UI設計和布局工具, 一個XML文件

編程語言

范疇

“如何做UI” - 是架構和工具鏈的選擇

“用什么寫代碼” - 是語言的選擇

關系

是一種可用工具,可以用Objective-C或Swift來配合它操作

是一種實現語言,可以用來編寫操作Storyboard的邏輯,也可以不用Storyboard

功能

可視化地創建視圖控制器(ViewController)、UI元素(按鈕、標簽等)和界面之間的跳轉邏輯(Segue)

實現應用程序的業務邏輯、數據模型、網絡請求、數據庫操作、性能優化等所有功能

輸出物

生成一個 .storyboard

文件,本質是XML

生成 .m

.h

源代碼文件

可替代性

可被 Multiple StoryboardsXIBs純代碼布局SwiftUI 替代

可被 Swift 語言替代


詳細闡述

1. Single Storyboard:一種UI構建策略

Single Storyboard強調的是 “用一個文件管理所有界面”

  • 如何與Objective-C配合?
    • 你在 Main.storyboard 上拖拽一個ViewController和一個Button。
    • 你需要創建一個 MyViewController.h / MyViewController.m 文件,并將storyboard中的ViewController的Class設置為 MyViewController
    • 你可以在 .m 文件中用Objective-C語法為那個Button創建 IBAction 出口(Action)。
    • 當按鈕被點擊時,storyboard中的可視化Segue可能會觸發跳轉,但跳轉前后的數據準備和傳遞工作(例如 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender)仍然需要你用Objective-C(或Swift)來編寫。
// MyViewController.m
#import "MyViewController.h"
#import "DetailViewController.h" @implementation MyViewController// 1. 這是一個通過IBAction關聯到Storyboard中按鈕點擊事件的方法
- (IBAction)buttonTapped:(id)sender {NSLog(@"Button tapped! This is Objective-C code.");
}// 2. 這是在執行Storyboard中的Segue跳轉前,傳遞數據的方法
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {if ([segue.identifier isEqualToString:@"showDetail"]) {DetailViewController *detailVC = segue.destinationViewController;detailVC.data = @{@"key": @"value"}; // 用Objective-C準備數據}
}@end

核心思想:Storyboard負責“看得到”的部分和簡單的流程,Objective-C代碼負責“看不見”的邏輯和復雜操作。

2. Objective-C:一種編程語言

Objective-C是一種通用、面向對象的編程語言。它完全不關心你的UI是怎么做出來的。

  • 它可以與任何UI構建方式配合:
    • 配合 Single Storyboard: 如上所述。
    • 配合 Multiple Storyboards: 你用 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Other" bundle:nil]; 來加載其他故事板。
    • 配合純代碼(Programmatically): 這是最能體現Objective-C能力的方式。你完全不用任何Storyboard或XIB文件。
// AppDelegate.m - 純代碼方式啟動應用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 1. 創建窗口(完全用Objective-C代碼)self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];self.window.backgroundColor = [UIColor whiteColor];// 2. 創建根視圖控制器MyRootViewController *rootVC = [[MyRootViewController alloc] init];// 3. 創建導航控制器UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootVC];// 4. 設置窗口的根視圖控制器self.window.rootViewController = navController;// 5. 顯示窗口[self.window makeKeyAndVisible];return YES;
}// MyRootViewController.m - 純代碼方式構建界面
- (void)viewDidLoad {[super viewDidLoad];// 1. 創建按鈕(完全用Objective-C代碼)UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];button.frame = CGRectMake(100, 100, 200, 50);[button setTitle:@"Press Me" forState:UIControlStateNormal];[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];// ... 可以使用類似Masonry的庫來代碼設置AutoLayout約束 ...
}- (void)buttonTapped:(id)sender {// 2. 用Objective-C代碼實現跳轉邏輯DetailViewController *detailVC = [[DetailViewController alloc] init];detailVC.data = @{@"key": @"value"};[self.navigationController pushViewController:detailVC animated:YES];
}

核心思想:Objective-C是實現的基石,無論UI層面如何選擇,最終的功能都要靠它(或Swift)來實現。


總結與類比

場景

解釋

使用 Single Storyboard + Objective-C

這是 iOS 5~8時代非常經典和常見的模式。開發者用Objective-C寫業務邏輯,同時享受Storyboard可視化搭建UI的便利。適合小型項目或初學者。

使用 純代碼(Objective-C)

這是 大型項目、多人協作 的首選。避免了Storyboard的合并沖突,對UI的控制力極強,方便復用和組件化。對開發者要求較高。

使用 Single Storyboard + Swift

和第一種一樣,只是編程語言從Objective-C換成了更現代的Swift。

使用 純代碼(Swift)

目前最主流的高級開發模式之一。結合Swift語言的安全和表達力,以及純代碼的維護優勢。

結論:

把它們看作“區別”不如看作“組合”。Objective-C是語言,是基礎;Single Storyboard是工具,是策略。 你可以用Objective-C去操作Single Storyboard,也可以用Objective-C完全拋開Storyboard。

在iOS開發的演進中,我們經歷了:

  1. Objective-C + Storyboard/XIB (舊時代主流)
  2. Objective-C + 純代碼 (舊時代大型項目首選)
  3. Swift + Storyboard/XIB (過渡期)
  4. Swift + 純代碼 (當前時代主流之一)
  5. Swift + SwiftUI (Apple推動的未來方向)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95271.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

孩子玩手機都近視了,怎樣限制小孩的手機使用時長?

最近兩周,我給孩子檢查作業時發現娃總是把眼睛瞇成一條縫,而且每隔幾分鐘就會用手背揉眼睛,有時候揉得眼圈都紅了。有一次默寫單詞,他把 “太陽” 寫成了 “大陽”,我給他指出來,他卻盯著本子說 “沒有錯”…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(六)

第五章 案例三:GoEHRStream - 實時電子病歷數據流處理系統 5.1 案例背景與需求分析 5.1.1 電子病歷數據流處理概述 電子健康記錄(Electronic Health Record, EHR)系統是現代醫療信息化的核心,存儲了患者從出生到死亡的完整健康信息,包括 demographics、診斷、用藥、手術、…

GEM5學習(2):運行x86Demo示例

創建腳本 配置腳本內容參考官網的說明gem5: Creating a simple configuration script 首先根據官方說明創建腳本文件 mkdir configs/tutorial/part1/ touch configs/tutorial/part1/simple.py simple.py 中的內容如下: from gem5.prebuilt.demo.x86_demo_board…

通過 FinalShell 訪問服務器并運行 GUI 程序,提示 “Cannot connect to X server“ 的解決方法

FinalShell 是一個 SSH 客戶端,默認情況下 不支持 X11 圖形轉發(不像 ssh -X 或 ssh -Y),所以直接運行 GUI 程序(如 Qt、GNOME、Matplotlib 等)會報錯: Error: Cant open display: Failed to c…

1.人工智能——概述

應用領域 替代低端勞動,解決危險、高體力精力損耗領域 什么是智能制造?數字孿生?邊緣計算? 邊緣計算 是 數字孿生 的 “感官和神經末梢”,負責采集本地實時數據和即時反應。瑣碎數據不上傳總服務器,實時進行…

傳統園區能源轉型破局之道:智慧能源管理系統驅動的“源-網-荷-儲”協同賦能

傳統園區能源結構轉型 政策要求:福建提出2025年可再生能源滲透率≥25%,山東強調“源網荷儲一體化”,安徽要求清潔能源就地消納。系統解決方案:多能協同調控:集成光伏、儲能、充電樁數據,通過AI算法動態優化…

[光學原理與應用-353]:ZEMAX - 設置 - 可視化工具:2D視圖、3D視圖、實體模型三者的區別,以及如何設置光線的數量

在光學設計軟件ZEMAX中,2D視圖、3D視圖和實體模型是三種不同的可視化工具,分別用于從不同維度展示光學系統的結構、布局和物理特性。它們的核心區別體現在維度、功能、應用場景及信息呈現方式上,以下是詳細對比:一、維度與信息呈現…

《sklearn機器學習》——交叉驗證迭代器

sklearn 交叉驗證迭代器 在 scikit-learn (sklearn) 中,交叉驗證迭代器(Cross-Validation Iterators)是一組用于生成訓練集和驗證集索引的工具。它們是 model_selection 模塊的核心組件,決定了數據如何被分割,從而支持…

Trae+Chrome MCP Server 讓AI接管你的瀏覽器

一、核心優勢1、無縫集成現有瀏覽器環境直接復用用戶已打開的 Chrome 瀏覽器,保留所有登錄狀態、書簽、擴展及歷史記錄,無需重新登錄或配置環境。對比傳統工具(如 Playwright)需獨立啟動瀏覽器進程且無法保留用戶環境,…

Shell 編程 —— 正則表達式與文本處理器

目錄 一. 正則表達式 1.1 定義 1.2 用途 1.3 Linux 正則表達式分類 1.4 正則表達式組成 (1)普通字符 (2)元字符:規則的核心載體 (3) 重復次數 (4)兩類正則的核心…

Springboot 監控篇

在 Spring Boot 中實現 JVM 在線監控(包括線程曲線、內存使用、GC 情況等),最常用的方案是結合 Spring Boot Actuator Micrometer 監控可視化工具(如 Grafana、Prometheus)。以下是完整實現方案: 一、核…

Java 大視界 --Java 大數據在智能教育學習資源整合與知識圖譜構建中的深度應用(406)

Java 大視界 --Java 大數據在智能教育學習資源整合與知識圖譜構建中的深度應用(406)引言:正文:一、智能教育的兩大核心痛點與 Java 大數據的適配性1.1 資源整合:42% 重復率背后的 “三大堵點”1.2 知識圖譜&#xff1a…

2025年新版C語言 模電數電及51單片機Proteus嵌入式開發入門實戰系統學習,一整套全齊了再也不用東拼西湊

最近有同學說想系統學習嵌入式,問我有沒有系統學習的路線推薦。剛入門的同學可能不知道如何下手,這里一站式安排上。先說下學習的順序,先學習C語言,接著學習模電數電(即模擬電路和數字電路)最后學習51單片機…

Android的USB通信 (AOA Android開放配件協議)

USB 主機和配件概覽Android 通過 USB 配件和 USB 主機兩種模式支持各種 USB 外圍設備和 Android USB 配件(實現 Android 配件協議的硬件)。在 USB 配件模式下,外部 USB 硬件充當 USB 主機。配件示例可能包括機器人控制器、擴展塢、診斷和音樂…

人工智能視頻畫質增強和修復軟件Topaz Video AI v7.1.1最新漢化,自帶星光模型

軟件介紹 這是一款專業的視頻修復工具-topaz video ai,該版本是解壓即可使用,自帶漢化,免登陸無輸出水印。 軟件特點 不登錄不注冊解壓即可使用無水印輸出視頻畫質提升 軟件使用 選擇我們需要提升畫質的視頻即可 軟件下載 夸克 其他網盤…

LeetCode 777.在LR字符串中交換相鄰字符

在一個由 ‘L’ , ‘R’ 和 ‘X’ 三個字符組成的字符串(例如"RXXLRXRXL")中進行移動操作。一次移動操作指用一個 “LX” 替換一個 “XL”,或者用一個 “XR” 替換一個 “RX”。現給定起始字符串 start 和結束字符串 result&#x…

RK-Android15-WIFI白名單功能實現

實現WIFI白名單功能 。 三個模式: 1、默認模式:允許搜索所有的WIFI顯示、搜索出來 ; 2、禁用模式:允許所有WIFI顯示,能夠搜索出來 ;3、白名單模式:允許指定WIFI名單顯示,被搜索出來 文章目錄 前言-需求 一、參考資料 二、核心修改文件和實現方式 1、修改文件 疑問思考 …

Maven + JUnit:Java單元測試的堅實組合

Maven JUnit:Java單元測試的堅實組合Maven JUnit:Java單元測試的堅實組合一、什么是軟件測試?二、測試的維度:階段與方法(一)測試的四大階段(二)測試的三大方法三、main方法測試與…

FFMPEG 10BIT下 Intel b570 qsv 硬解AV1,H265視頻編碼測試

上10bitffmpeg 8.0 b570最新驅動 ,CPU 12100F 顯卡 Intel b570 ffmpeg -hwaccel_output_format qsv -i "XXX.mkv" -vf "formatp010le" -c:v hevc_qsv -global_quality 19 -quality best -rc_mode ICQ -preset veryslow -g 120 -refs 5 -b…

SQL分類詳解:掌握DQL、DML、DDL等數據庫語言類型

如果你是一名數據庫運維工程師,或者正在學習數據庫技術,那么理解SQL的不同類型是非常重要的。讓我們一起看看SQL到底有哪些種類,以及它們各自的作用。 1. 什么是SQL? SQL(Structured Query Language)是一種…