You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Objective-C中注册NSItemProvider实现iPad拖放功能?

在Objective-C中实现NSItemProvider的拖放注册

我完全理解你现在的困惑——Swift和Objective-C的闭包/block语法差异确实容易让人卡壳,尤其是这种带嵌套block的场景。咱们直接把你参考的Swift代码转换成正确的Objective-C写法,拆解清楚关键部分:

首先,先看完整的可运行代码:

// 假设你已经有要传递的文本数据data
NSData *data = [@"要拖放的文本内容" dataUsingEncoding:NSUTF8StringEncoding];

NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithItem:data 
                                                      typeIdentifier:(NSString *)kUTTypePlainText];

[itemProvider registerDataRepresentationForTypeIdentifier:(NSString *)kUTTypePlainText 
                                               visibility:NSItemProviderRepresentationVisibilityAll 
                                               loadHandler:^NSProgress * _Nullable(void (^completionHandler)(NSData * _Nullable data, NSError * _Nullable error)) {
    // 调用完成处理block,传递数据和错误(这里没有错误所以传nil)
    completionHandler(data, nil);
    
    // 返回nil表示不需要跟踪加载进度,若需要进度可创建NSProgress实例返回
    return nil;
}];

关键语法解析

你卡住的loadHandler部分是一个嵌套block,对应Swift里的尾随闭包:

  1. OC的block语法格式是^返回值类型(参数列表) { 实现代码 },这里loadHandler的block需要返回NSProgress*(可以返回nil),它的参数是一个名为completionHandler的block。
  2. 这个completionHandler的类型是void(^)(NSData * _Nullable, NSError * _Nullable),和Swift里的(Data?, Error?) -> Void完全对应,你只需要在block内部调用它并传入你的数据和错误信息即可。
  3. 注意kUTTypePlainText是CFString类型,在OC里需要强制转换成NSString*,避免类型警告。

这样写就能和你参考的Swift代码实现完全一样的逻辑了,注册纯文本类型的数据表示,并且在loadHandler里完成数据的传递。

内容的提问来源于stack exchange,提问作者user9272716

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:03