如何在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里的尾随闭包:
- OC的block语法格式是
^返回值类型(参数列表) { 实现代码 },这里loadHandler的block需要返回NSProgress*(可以返回nil),它的参数是一个名为completionHandler的block。 - 这个
completionHandler的类型是void(^)(NSData * _Nullable, NSError * _Nullable),和Swift里的(Data?, Error?) -> Void完全对应,你只需要在block内部调用它并传入你的数据和错误信息即可。 - 注意
kUTTypePlainText是CFString类型,在OC里需要强制转换成NSString*,避免类型警告。
这样写就能和你参考的Swift代码实现完全一样的逻辑了,注册纯文本类型的数据表示,并且在loadHandler里完成数据的传递。
内容的提问来源于stack exchange,提问作者user9272716
相关产品推荐
相关产品推荐

