苹果开发中什么是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)是一种…