ios - Swift 包管理器 - 在包的 Storyboard中设置自定义类失败

标签 ios swift xcode swift-package-manager swiftpm

我正在尝试为我们用来在我们的主项目中与 Carthage 链接的 iOS 框架实现对 Swift 包管理器的支持。该框架的名称是“OptionsSheetKit”
该框架包含一个 UIViewController那是 UIAlertController 的复制品与 .sheet外观,以及具有 View Controller 设计的 Storyboard 。
当我创建 View Controller 的实例时 从框架内像这样:

let content = UIStoryboard(name: "OptionsSheet", bundle: .module).instantiateViewController(withIdentifier: PickerViewController.identifier) as? PickerViewController
该应用程序编译并运行,但是不再设置所有自定义集类,并且我在 XCode 的调试区域中收到此警告:
2021-02-23 17:19:15.606835+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.607631+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.608020+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.608378+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.608776+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
我的 Package.swift看起来像这样:
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "OptionsSheetKit",
    platforms: [
        .iOS(.v12)
    ],
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "OptionsSheetKit",
            targets: ["OptionsSheetKit"]),
    ],
    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: "OptionsSheetKit",
            dependencies: []),
    ]
)

这是在 Storyboard 中设置类的方式,但找不到它。
Storyboard custom class
也许它无法使模块正确。
我知道对于 SwiftPM .storyboard是一个已知文件,它会自动为包创建一个资源包,我可以在应用程序的主包中看到该资源包,文件名为 OptionsSheetKit_OptionsSheetKit.bundle ,我知道它的包标识符必须是 OptionsSheetKit-OptionsSheetKit-resources ,所以它都在那里。
我设法使它工作的唯一方法是使用 iOS 13+ 方法 UIStoryboard.instantiateViewController(identifier: String, creator: NSCoder) 实例化 ViewController但它是一种解决方法,因为我不仅要为 View Controller 这样做,而且要为我在 Controller View 中设置的每个自定义类都这样做,这使得 Storyboard 毫无意义。
更重要的是该应用程序的最小部署目标是 iOS 12.2,所以这对我来说不会削减它。
你们知道为什么会失败吗?我尝试设置 type图书馆产品中的参数到.dynamic我知道动态框架可以在它们的包中包含资源,正如我之前所做的那样,尝试了 .static也可以输入,但无论哪种方式都无法使其工作。
这是一个已知的错误,还是只是 SwiftPM 仍然不支持这个?
提前致谢!

最佳答案

我设法通过添加 @objc 来修复它在我的 View Controller 的类定义中命名并在 Storyboard 中使用该名称。

@objc(OBJCPickerViewController)
public final class PickerViewController { ... }
这就是我使用 OBJCPickerViewController 的方式 Storyboard中的名称
enter image description here
一切都很好。我认为这行得通的原因是因为在 Objective C 中没有模块(这就是为什么 @objc 类的名称中有前缀)和 @objc您基本上绕过了类/模块名称修改,使 Storyboard 非常容易找到您的类。
我找到了解决方案here ,所以向 Marius Ilie 大喊大叫,让他写下来!
如果你们中的任何人可以提出一个更优雅的解决方案,请告诉我,这样我们就可以停止依赖 objc 来将我们保存在我们的 swift 代码中。

关于ios - Swift 包管理器 - 在包的 Storyboard中设置自定义类失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66336828/

相关文章:

swift - 我们可以在枚举上使用 `if` 或 `guard` 而不是 `switch` 来提取值吗?

ios - 在 UICollectionView 单元格中快速调整图像大小

ios - "Turn Off Airplane Mode"警报已弃用?

ios - UITableViewController - 比屏幕宽的 TableView

ios - ViewController 中的顶部栏 ios swift 显示上一个顶部栏

ios - iPad Air 2 和 iPad Pro 的不同布局

iphone - 实例变量未在内存中分配

ios - 使用 NSMutableAttributedStrings 快速更改文本颜色

ios - 如何每天每天重复几个小时的本地通知?

ios - 在 UITableViewCell 的部分自定义行