将主故事板存储在Swift包中



我在Xcode中玩Swift软件包。我想知道是否有可能移动你的应用程序的";主情节板";Swift Package。通过";主情节板";,我指的是在info.plist中设置的密钥NSMainStoryboardFile下的那个(人类可读的名称是Main storyboard file base name (macOS)

这是我的包的文件夹结构:

.
├── Package.swift
├── README.md
├── Sources
│   └── FooPackage
│       ├── FooPackage.swift
│       └── Resources
│           ├── Base.lproj
│           │   └── Main Menu.storyboard
│           └── img.png
└── Tests
└── FooPackageTests
└── FooPackageTests.swift

这是我的package.swift文件,与Xcode模板没有变化

// swift-tools-version:5.5
// The swift-tools-version declares the minimum version of Swift required to build this package.
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "FooPackage",
defaultLocalization: "en",
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "FooPackage",
targets: ["FooPackage"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "FooPackage",
dependencies: []),
.testTarget(
name: "FooPackage",
dependencies: ["FooPackage"]),
]
)

在单元测试中,我检查我的故事板是否可以访问,它是:

print(Bundle.module.path(forResource: "Main Menu", ofType: "storyboard")!)
// => /Users/Alex/FooPackage/.build/x86_64-apple-macosx/debug/FooPackage_FooPackage.bundle/Base.lproj/Main Menu.storyboard

如您所见,我通过Bundle.module访问它。包含此Swift Package的其他应用程序将无法访问该访问器。据我所知,这是一个有意的设计:你的包裹预计会暴露出它的";共享的";使用明确定义的公共API捆绑资源。

尽管如此,这似乎与info.plist期望的主情节提要位于主捆绑包中不兼容。有办法绕过这个吗?

我以前处理过这个问题,记不清了,但我认为你需要在包中的依赖项之后添加这个

resources: [
.process("Main Menu")
]),

请记住,它不会是一个默认的故事板。你必须从代码中调用它。

最新更新