3

我正在使用 loadItemForTypeIdentifier:options:completionHandler:NSItemProvider 对象上的方法通过 iOS 8 中的 Share 扩展从 Safari 中提取 url。

在 Objective-C 中,这段代码可以编译并运行:

    [itemProvider loadItemForTypeIdentifier:(@"public.url" options:nil completionHandler:^(NSURL *url, NSError *error) {
        //My code
    }];

然而,在 Swift 中,我得到了“NSSecureCoding!” 当我尝试执行类似操作时,它不是“NSURL”编译错误的子类型:

    itemProvider.loadItemForTypeIdentifier("public.url", options: nil, completionHandler: { (urlItem:NSURL, error:NSError!) in
        //My code
    })

如果我将 bang 添加到 NSURL 参数类型,如NSURL!我得到“无法将表达式的类型 'Void' 转换为类型 'Void'”编译错误。如果我将默认参数键入为NSSecureCoding!,它会编译,但块/闭包不会运行。

我究竟做错了什么?

4

4 回答 4

3

您不需要指定 urlItem 或错误的类型,因为它们可以从 loadItemForTypeIdentifier:options:completionHandler 的声明中推断出来。只需执行以下操作:

itemProvider.loadItemForTypeIdentifier("public.url", options: nil, completionHandler: { 
    (urlItem, error) in
    //My code
})

更好的是,您可以将闭包移到方法调用之外:

itemProvider.loadItemForTypeIdentifier("public.url", options: nil) {
    (urlItem, error) in
    //My code
}
于 2014-06-16T02:03:03.133 回答
2

此 API 在内部使用反射:它查看块的第一个参数的类型来决定返回什么。与 Swift 相比,这取决于 Objective-C 对块签名的更宽松执行——因此在 Swift 中不起作用。(是的,仍然。)请参阅开发者论坛上的此讨论

我建议向 Apple 提交错误报告并编写小的 Objective-C 包装方法来读取您需要的每种类型的数据。

我可能忽略了一些东西。如果有人找到了一种在 Swift 中完成这项工作的巧妙方法,我很想听听。

于 2016-10-16T20:56:27.117 回答
1

要使用的新 API 是 canLoadObject 和 loadObject,这样使用它:

if (itemProvider.canLoadObject(ofClass: NSURL.self)) {
            print("==== attachment is URL")
            itemProvider.loadObject(ofClass: NSURL.self, completionHandler:       
            {
                (data, error) in
                print("==== url object = \(data)")
            })
}

同样可以用于 UIImage

https://developer.apple.com/documentation/uikit/drag_and_drop/data_delivery_with_drag_and_drop

于 2020-02-21T06:46:57.783 回答
0

万一您或其他人仍然需要解决方案,这很简单。只需向 NSURL 添加一个带有强制转换的侧变量。这里是:

itemProvider.loadItemForTypeIdentifier("public.url", options: nil) {
(urlItem, error) in
    let url : NSURL = urlItem : NSURL
    // Whatever you like to do with your new url
}
于 2014-09-22T22:21:40.180 回答