创建基于 UIKit 的原生 iOS 项目
现在用 Xcode 新建 App,默认已经是 SwiftUI。我还是更习惯手写 UIKit,所以把从建工程到跑起来的步骤记一下。
本文用的是 Xcode 16.5。目标很简单:不要 Storyboard 拖控件,用纯代码把界面拉起来。
前置准备
- 一台 macOS 电脑
- 已经装好 Xcode,文章用的版本是 16.5
创建项目
- 打开 Xcode,选择 Create New Project
- 模板界面先选 iOS,再选 App,然后点 Next
- 项目配置可以按下面填:
- Product Name:项目名称,例如
TestApp - Team:没有开发者账号就选 None
- Organization Identifier:唯一标识符,比如
com.example - Interface:选 Storyboard。别直接选 SwiftUI,否则后面没有
SceneDelegate,改成 UIKit 会更麻烦 - Language:99% 的情况都选 Swift
- Testing System:暂时不需要
- Storage:可选可不选,先不选就行
- Product Name:项目名称,例如
点 Next,选个保存路径,创建项目。
图解步骤:




删除 Storyboard
新建出来的项目默认还是走 Storyboard。要纯代码开发,相关文件和配置都得清掉。
- 删除项目里的
Main.storyboard(没有这个文件就跳过) - 点项目根目录,切到 TARGETS 下的 Info
- 找到 Main storyboard file base name,删掉这一条(对应
UIMainStoryboardFile) - 再展开 Application Scene Manifest → Scene Configuration,把里面的 Storyboard Name 也删掉(对应
UISceneStoryboardFile)
两处都要删。只删文件、或者只清其中一处,启动时还会去加载已经不存在的 Main,直接崩溃。
Launch Screen 那一项不要动,那是启动图,不是主界面。怎么换成自己的图,写在 设置启动图。
Build Settings 里如果还能搜到 UIMainStoryboardFile,一并清空就行。


设置根控制器
打开 SceneDelegate.swift,用代码手动把窗口和根控制器挂上。Xcode 16 的 App 模板走的是 Scene 生命周期,窗口要挂在 UIWindowScene 上,不用再写回以前那种只给 AppDelegate.window 赋值的老办法。
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// 核心代码
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = ViewController()
window?.makeKeyAndVisible()
}
}
自定义控制器
打开 ViewController.swift,先铺一层背景,再加一行居中文本,用来确认窗口已经接到你的控制器。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 设置窗口背景颜色
view.backgroundColor = .systemPink
// 添加文本
let label = UILabel()
label.text = "Hello world!"
label.textColor = .white
label.textAlignment = .center
label.frame = view.bounds
// 添加到视图
view.addSubview(label)
}
}
后面如果要加约束,把 label.frame = view.bounds 换成 Auto Layout 或 SnapKit 就行。这一步只是验证启动链路通了。
运行项目
点 Xcode 左上角的运行按钮,或者按 Cmd + R,模拟器就会起来。正常的话,你会看到粉色背景和白色的 Hello world!。


至此,你已经成功创建了一个基于 UIKit 的 Swift 项目:没有 Main.storyboard,窗口和根控制器都在 SceneDelegate 里创建。
安装 CocoaPods
如果你想用 CocoaPods 当包管理器,项目里其实就 4 步。注意:这里不教怎么装 pod 环境。
- 打开终端,切到 iOS 项目根目录(也就是包含
.xcodeproj的那个文件夹):
cd /你的项目路径/
- 生成
Podfile:
pod init
- 编辑
Podfile,按需引入第三方库:
target 'YourProjectName' do
# 禁用自动包含框架,一般默认即可
use_frameworks!
# 引入你需要的第三方库,版本号按需改
pod 'SnapKit', '~> 5.7'
end
- 保存后,在终端安装依赖:
pod install
安装完成后,根目录会多出一个 .xcworkspace。切记:以后请双击打开 你的项目名称.xcworkspace 来开发,不要再打开原来的 .xcodeproj。
这一步并不难,但在 Xcode 16 里跑 pod 脚本,经常会碰到沙盒拦截 rsync:
Sandbox: rsync deny(1) file-write-create
.../Build/Products/Debug-iphoneos/YourApp.app/Frameworks/Some.framework
解决办法:打开 Build Settings,搜索 sandbox,把 Build Options 里的 User Script Sandboxing 改成 NO。

安装 Swift Package
不想折腾 CocoaPods,用 Xcode 自带的 Swift Package 就行。还是以 SnapKit 为例。同一个库不要两边各加一次。
- 打开
.xcodeproj(不用 workspace) - 菜单栏选 File → Add Package Dependencies...
- 右上角贴仓库地址,例如:
https://github.com/SnapKit/SnapKit.git
- 依赖规则一般选 Up to Next Major Version,点 Add Package
- 确认加到当前 App target,再点 Add Package
加完之后,代码里 import SnapKit 就能用。根目录会多一个 Package.resolved,用来锁定版本,建议一并提交。
也可以点项目根目录,切到 PACKAGE DEPENDENCIES,点左下角 +,效果一样。