苹果开发中什么是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)来编写。
objectivec 复制代码
// 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文件。
ini 复制代码
// 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推动的未来方向)
相关推荐
用户6883362059703 小时前
SolidJS / Qwik:零 JS 运行时与极致懒加载
前端
华仔啊3 小时前
前后端为个下拉框又吵起来了?一招优雅的 Java 枚举解法,让团队和谐开发!
java·后端
Devlive 开源社区3 小时前
CodeForge v25.0.3 发布:Web 技术栈全覆盖,编辑器个性化定制新时代
前端·编辑器
Charlo3 小时前
是什么让一个AI系统成为智能体(Agent)?
前端·后端
哈基米喜欢哈哈哈3 小时前
MongoDB入门
数据库·后端·mongodb
石小石Orz3 小时前
来自面试官给我的建议,我备受启发
前端·后端·面试
Java水解3 小时前
MySQL 高级查询:JOIN、子查询、窗口函数
后端·mysql
迪迦3 小时前
基于uni-app的校园综合服务平台开发实战
前端·javascript·开源·uniapp
一蓑烟雨,一任平生3 小时前
uni-app 实现做练习题(每一题从后端接口请求&切换动画&记录错题)
前端·javascript·html