ios 如何在KMM项目中处理PHPickerViewController的回调?

fae0ux8s  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(143)

我正在开发一个具有视频拾取功能的KMM应用程序。对于iOS实现,我使用PHPickerViewController。视图控制器很好地呈现了,但我不知道如何处理来自PHPickerViewControllerDelegateProtocol的回调参数didFinishPicking
我的目标是从picker给出的文件中提取字节数组
以下是我的评论:

private val delegate = object : NSObject(), PHPickerViewControllerDelegateProtocol,
    UINavigationControllerDelegateProtocol {

    override fun picker(picker: PHPickerViewController, didFinishPicking: List<*>) {
        // TODO extract the byte array form the file referenced in the picker param
        picker.dismissViewControllerAnimated(flag = false) {}
    }
}
gg58donl

gg58donl1#

当从Kotlin部分实现一些iOS特定的功能时,我总是从在GitHub上寻找示例开始,在这种情况下,你可以找到一些this query的示例。
在某些情况下,当此搜索没有给予您任何结果时,您可以查找iOS示例并弄清楚如何将其转换为Kotlin。使用ObjC示例更容易,因为这是Kotlin使用的源代码。使用这种方法,你可以有用户this article作为参考。
KMP有一些与ObjC泛型相关的限制,而且一些命名可能会令人困惑,所以使用Xcode或documentation来查看ObjC头文件总是一个好主意。

- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results

我认为从这段代码中可以更清楚地看到,这里需要results,但在Kotlin中,这个参数被称为didFinishPicking-这是因为ObjC是如何构建的,函数参数有两个名称,有时它们是相同的,但Kotlin只能取其中一个,它取第一个。
由于ObjC泛型,类型丢失,所以你需要转换它:

val result = didFinishPicking.firstOrNull() as? PHPickerResult

最后,您可以使用此对象来获取数据。如果你正在寻找视频,请使用UTTypeMovie

result.itemProvider().loadDataRepresentationForContentType(UTTypeMovie) { data, error ->
    if (data != null) {
        val bytes = data.toByteArray()
    }
}

相关问题