Хранить основную раскадровку в пакете Swift

avatar
Alexander
1 июля 2021 в 20:51
162
1
2

Я играю с пакетами 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 ожиданием того, что основная раскадровка находится в основном комплекте. Есть ли способ обойти это?

Источник

Ответы (1)

avatar
SeaSpell
1 июля 2021 в 22:00
0

Я имел дело с этим раньше, и я не могу точно вспомнить, но я думаю, вам нужно добавить это после зависимостей в package

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

Имейте в виду, что это не будет раскадровка по умолчанию. Вам придется вызывать его из кода.

Alexander
1 июля 2021 в 23:22
0

В этом случае вы удаляете ключ NSMainStoryboardFile из вашего info.plist и вручную загружаете главное меню из раскадровки и настраиваете его в своем приложении?

SeaSpell
2 июля 2021 в 00:36
0

Я честно не могу вспомнить .. Надеюсь, это поможет. useyourloaf.com/blog/add-resources-to-swift-packages

SeaSpell
2 июля 2021 в 00:37
0

Я могу сказать вам, что делал это в прошлом. Это возможно.