我正在开发一个具有视频拾取功能的KMM应用程序.对于iOS实现,我使用的是PHPickerViewController.视图控制器呈现得很好,但我不知道如何处理来自PHPickerViewControllerDelegateProtocol的回调参数didFinishPicking.

我的目标是从picker给出的文件中提取字节数组

以下是我的WIP:

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) {}
    }
} 

推荐答案

当从Kotlin Part实现一些特定于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()
    }
}

Ios相关问答推荐

为什么Reaction-Native-Vision-Camera不能与闪光灯一起使用?

如何在PINCH上添加UITextfield以zoom 图像

UITableViewCell编程约束问题

如何在Android或iPhone上的原生react 中处理其他应用程序通知?

swiftui 图像放大时无法正确拖动

为什么applicationState发布者只发布一次?

如何包含 Xcode 子项目标头?

SwiftUI 中的偏移量和按钮有问题吗?

Swift如何表示单位转换的标准大气压

如何将私钥添加到分发证书?

NSURLConnection 的 Xcode 4 警告未使用表达式结果

关闭通过模态 segue 显示的视图

以编程方式创建按钮并设置背景图像

如何更改uitableview删除按钮文本

在 UITableViewController 中使用 UISearchDisplayController 时断言失败

Flutter:如何创建一个新项目

NSURL 到带有 XCTest 的测试包中的文件路径

iOS 中的 Google Analytics SDK 3.0 _sqlite3 链接器错误

UITableView 中的圆形 UIImageView 没有性能影响?

你如何以编程方式从视图控制器中画一条线?