Я играю с пакетами Swift в Xcode. Мне было интересно, можно ли переместить «основную раскадровку» вашего приложения в пакет Swift. Под «основной раскадровкой» я подразумеваю ту, которая установлена в вашем 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, не будут иметь доступа к этому средству доступа. Насколько я могу судить, это предполагаемый дизайн: ожидается, что ваш пакет будет предоставлять свои «общие» ресурсы пакета с использованием явно определенных общедоступных API.
Тем не менее, это не совместимо с info.plist
ожиданием того, что основная раскадровка находится в основном комплекте. Есть ли способ обойти это?
В этом случае вы удаляете ключ
NSMainStoryboardFile
из вашегоinfo.plist
и вручную загружаете главное меню из раскадровки и настраиваете его в своем приложении?Я честно не могу вспомнить .. Надеюсь, это поможет. useyourloaf.com/blog/add-resources-to-swift-packages
Я могу сказать вам, что делал это в прошлом. Это возможно.