ios - Objective-C 项目中的 Swift CocoaPods 库

标签 ios objective-c swift cocoapods

我找到了一些关于如何将 Objective-C 库包含到 Swift 项目中的在线资源,以及一些关于如何进行反向操作的有限资源(这就是我所追求的)。

我已经设法让我的项目根据我在这个问题中所做的工作进行编译和运行:Swift CocoaPod Library in Objective-C Project Migration from Swift 3 to 4/5

但是,每当我尝试从我的 ObjC 项目中的 Swift 库中访问任何内容时,我的应用程序都会崩溃并显示以下内容......

2020-01-29 14:42:09.756352-0700 Hyperion[13547:2723315] -[HGCircularSlider.RangeCircularSlider setStartPointValue:]: unrecognized selector sent to instance 0x1074088c0
2020-01-29 14:42:09.763045-0700 Hyperion[13547:2723315] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[HGCircularSlider.RangeCircularSlider setStartPointValue:]: unrecognized selector sent to instance 0x1074088c0'
*** First throw call stack:
(0x18e32ea48 0x18e055fa4 0x18e2325a8 0x1923cf86c 0x18e332af4 0x18e334a7c 0x10208f554 0x10208d4d4 0x192d15dec 0x192be580c 0x10208d388 0x10208b570 0x191d8cab8 0x191d8d160 0x191d11b40 0x191d11c6c 0x191d192c0 0x191d23b84 0x191d23f70 0x191d1716c 0x191d119a0 0x191d87134 0x191d87838 0x1924f3d74 0x1924f7224 0x1924f70d0 0x1924f739c 0x191d87290 0x191d87838 0x1924f3d74 0x1924f7224 0x1924f70d0 0x1924f739c 0x191d87290 0x191d87838 0x191cceaec 0x191ccdf08 0x191cca9c8 0x191cca7e0 0x191ccde54 0x1923a2e50 0x191b3e148 0x1923a2e50 0x191dd9494 0x191dd97f8 0x191b40b58 0x1923a2e50 0x191dd9494 0x191dd97f8 0x191dd8814 0x1923dc3d4 0x1923dd714 0x1923b9e2c 0x192431fa4 0x192434500 0x19242d374 0x18e2aca00 0x18e2ac958 0x18e2ac0f0 0x18e2a723c 0x18e2a6adc 0x19822c328 0x1923a1ae0 0x1020de520 0x18e130360)
libc++abi.dylib: terminating with uncaught exception of type NSException

正如我在上面链接的问题的答案中所述,我编写了一个 Swift 类,它公开了我需要的 CocoaPod 库函数,它允许我的项目编译......
import Foundation
import HGCircularSlider

@objc public class CircularSliderObjc: RangeCircularSlider
{
    @objc override open var startPointValue: CGFloat {

        get {
            return super.startPointValue;
        }

        set {
            super.startPointValue = newValue;
        }
    }

    @objc override open var endPointValue: CGFloat {

        get {
            return super.endPointValue;
        }

        set {
            super.endPointValue = newValue;
        }
    }

    @objc override open var endThumbImage: UIImage? {

        get {
            return super.endThumbImage;
        }

        set {
            super.endThumbImage = newValue;
        }
    }

    @objc override open var startThumbImage: UIImage? {

        get {
            return super.startThumbImage;
        }

        set {
            super.startThumbImage = newValue;
        }
    }
}

正如您在项目中看到的那样,我将 startPointValue 暴露为集合和获取。但是在运行时调用此函数会导致崩溃。

这是调用类的标题...
#import "BaseViewController.h"
#import "Hyperion-Swift.h"

@interface TemperatureDeviceViewController : BaseViewController

@property (weak, nonatomic) IBOutlet CircularSliderObjc *rangeSlider;

我的 .m 文件中的调用...
[self.rangeSlider setStartPointValue:[self getSliderValueForTemp:startValue]];

我假设我在这里错过了一个关键步骤?

更新 #1

我已经尝试了 Max 建议的答案,这很有意义。但是,因为这是我的 ViewController 中的 IBOutlet,所以他的解决方案确实不适用于我的用例。

我做了一些进一步的调试,并在我的 startPointValue 函数中放置了断点,以便查看“super”引用的内容。但是,在崩溃发生之前没有触发任何断点。因此我不确定对“ super ”的调用是实际原因吗?我认为这个判决还没有定论。

最佳答案

尝试重新设计包装类以封装而不是从框架类继承。例如:

@objc public class CircularSliderObjc
{
    let slider: RangeCircularSlider // NOT @objc!
    @objc var startPointValue: CGFloat {
        get {
            return slider.startPointValue;
        }
        set {
            slider.startPointValue = newValue;
        }
    }

这样,Objective-C 甚至根本不需要知道 Swift 类的存在。我的猜测是这在 super 上崩溃了。 ,从 Objective-C 访问特定于 Swift 的东西。

关于ios - Objective-C 项目中的 Swift CocoaPods 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59976138/

相关文章:

ios - CGAffineTransform 比例在 iOS10 上移动 View 中心(但在 iOS11 上则不然)

ios - 如何使用音乐播放器的 UI 在 iOS 中播放音频?

ios - Locale.current 在设备上报告错误的语言

objective-c - iOS/Objective-C:NSNotification

ios - dlsym 无法从 CoreTelephony 悄悄加载

swift - Swift 中的对象分配和初始化

ios - 如何在 Int 和 Float 类型中添加千位分隔符?

objective-c - 无法创建唯一的 NSNumber 数组 - iOS

ios - 核心动画围绕点旋转

ios - 重建 Realm 数据库