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

5
我正在尝试为我们在主项目中使用Carthage链接的iOS框架“OptionsSheetKit”实现对Swift Package Manager的支持。
该框架包含一个UIViewController,它是UIAlertController的复制品,具有.sheet外观,以及一个具有视图控制器设计的故事板。
当我从框架内部像这样创建视图控制器的实例:
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 custom class

也许它无法正确获取模块。我知道对于SwiftPM,.storyboard是一个已知的文件,并且它会自动为包创建资源束,在应用程序的主要资源束中可以看到该资源束,文件名为OptionsSheetKit_OptionsSheetKit.bundle,我知道它的束标识符必须是OptionsSheetKit-OptionsSheetKit-resources,所以一切都在那里。我成功地使其工作的唯一方法是使用iOS 13+方法UIStoryboard.instantiateViewController(identifier:String,creator:NSCoder)来实例化ViewController,但这是一个解决方法,因为我不仅需要为视图控制器这样做,而且还需要为每个自定义类设置控制器的视图,这使得故事板没有意义。更重要的是,应用程序的最小部署目标是iOS 12.2,所以这对我来说行不通。你们有想法为什么会失败吗?我尝试将库的产品中的type参数设置为.dynamic,因为我知道动态框架可以在它们的bundle中拥有资源,就像我以前做的那样,也尝试了.static类型,但两种方式都无法使其工作。
这是一个已知的错误,还是SwiftPM仍不支持这个功能?谢谢!
1个回答

3
我通过在我的视图控制器类定义中添加@objc名称并在故事板中使用该名称来修复了它。
@objc(OBJCPickerViewController)
public final class PickerViewController { ... }

这就是我在Storyboard中使用OBJCPickerViewController名称的方法。

enter image description here

一切运作良好。我认为这能够实现的原因是在Objective-C中没有模块(这就是为什么@objc类在它们的名称中有前缀),而使用@objc,你基本上可以绕过类/模块名称混淆,使得storyboard很容易找到你的类。
我在这里找到了解决方案,所以向Marius Ilie大声喊出来,感谢他写下了这个!
如果你们中有人能提出一个更优雅的解决方案,请让我知道,这样我们就不必依赖于objc在我们的swift代码中拯救我们了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接