4

我正在尝试为我们用来在我们的主项目中与 Carthage 链接的 iOS 框架实现对 Swift 包管理器的支持。该框架的名称是“OptionsSheetKit”

该框架包含一个具有外观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: []),
    ]
)

这是在情节提要中设置类的方式,但找不到它。

故事板自定义类

也许它无法使模块正确。

我知道 SwiftPM.storyboard是一个已知文件,它会自动为包创建一个资源包,我可以在应用程序的主包中看到该资源包的文件名OptionsSheetKit_OptionsSheetKit.bundle,我知道它的包标识符必须是OptionsSheetKit-OptionsSheetKit-resources,所以它全部在那里。

我设法使其工作的唯一方法是使用 iOS 13+ 方法实例化 ViewController,UIStoryboard.instantiateViewController(identifier: String, creator: NSCoder)但它是一种解决方法,因为我不仅要为视图控制器这样做,而且要为我在控制器的视图,这使得故事板毫无意义。

更重要的是该应用程序的最小部署目标是 iOS 12.2,所以这对我来说不会削减它。

你们知道为什么会失败吗?我尝试将type库产品中的参数设置为,.dynamic因为我知道动态框架可以在它们的包中包含资源,就像我之前那样,也尝试了该.static类型,但无法使其工作。

这是一个已知的错误,还是 SwiftPM 仍然不支持这个?

提前致谢!

4

1 回答 1

2

我设法通过@objc在视图控制器的类定义中添加名称并在情节提要中使用该名称来修复它。

@objc(OBJCPickerViewController)
public final class PickerViewController { ... }

这就是我OBJCPickerViewController在故事板中使用名称的方式

在此处输入图像描述

一切都很好。我认为这行得通的原因是因为在 Objective C 中没有模块(这就是为什么@objc类在其名称中具有前缀的原因)并且@objc您基本上绕过了类/模块名称修改,使情节提要非常容易找到您的类。

我在这里找到了解决方案,因此请向 Marius Ilie 大声疾呼写下这篇文章!

如果你们中的任何人可以提出一个更优雅的解决方案,请告诉我,这样我们就可以停止依赖 objc 来将我们保存在我们的 swift 代码中。

于 2021-03-04T07:26:44.273 回答