Ios UIPasteBoard“;“字符串”;返回零的财产,尽管;“哈斯特林斯”;是真的

Ios UIPasteBoard“;“字符串”;返回零的财产,尽管;“哈斯特林斯”;是真的,ios,objective-c,ios14,uipasteboard,Ios,Objective C,Ios14,Uipasteboard,我使用以下代码获取用户从应用程序外部复制到剪贴板的文本,以便他们可以将其粘贴到应用程序中: UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; if ([pasteboard hasStrings]) { NSString *text = pasteboard.string; } 这一直很好,直到iOS14我注意到我一直在崩溃,因为pasteboard.string是nil,尽管hasStrings是真的 我查看了

我使用以下代码获取用户从应用程序外部复制到剪贴板的文本,以便他们可以将其粘贴到应用程序中:

UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];

if ([pasteboard hasStrings])
{
    NSString *text = pasteboard.string;
}
这一直很好,直到
iOS14
我注意到我一直在崩溃,因为
pasteboard.string
nil
,尽管
hasStrings
是真的

我查看了文档,发现确实,
pasteboard.string
可能是
nil

存储在此属性中的值是NSString对象。这个 表示类型的关联数组为 UIPasteboardTypeListString,其中包括KuttTypeOutF8PlainText类型。 设置此属性将替换粘贴板中的所有当前项 与新的项目。如果第一项没有指示的值 类型,则返回nil

我的意思是,剪贴板中有某种不是
kUTTypeUTF8PlainText
的字符串,这就是为什么
pasteboard.string
nil
,但这是正确的解释吗


我只是对这里到底发生了什么感到困惑,并且不确定如果我遇到
pasteboard.string
nil

-[UIPasteboard hastrings]的情况,应该告诉我的用户什么==是
仅表示粘贴板中的项目具有类型为
public.utf8纯文本
或任何其他表示其为字符串的类型

但是
-[UIPasteboard string]
仍然可以返回
nil
,如果类
NSString
的对象无法从
项提供者提供的任何数据构造

下面是一个重现您所处情况的示例:

首先实现一个符合
NSItemProviderWriting

#导入
静态NSString*const-uttypeutf8纯文本=@“public.utf8纯文本”;
@接口测试对象:NSObject
@结束
@实现测试对象
-(NSData*)randomDataWithLength:(NSUTEGER)长度{
NSMutableData*data=[NSMutableData dataWithLength:length];
SecRandomCopyBytes(kSecRandomDefault、长度、数据.mutableBytes);
返回数据;
}
#pragma标记-NSItemProviderWriting
+(NSArray*)项目提供程序的可写类型标识符{
返回@[UTTypeUTF8PlainText];
}
-(可为Null的NSProgress*)loadDataWithTypeIdentifier:(非Null NSString*)ItemProviderCompletionHandler的类型标识符:(非Null void(^)(NSData*\u可为Null,NSError*\u可为Null))completionHandler{
//utf8字符串不能从中构造的随机数据
NSData*randomData=[长度为1的自随机数据];
completionHandler(随机数据,无);
返回零;
}
@结束
然后将测试对象放入纸板中

if (@available(iOS 11.0, *)) {
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    TestObject *item = [TestObject new];
    [pasteboard setObjects:@[item]];
    
    if ([pasteboard hasStrings]) {
        // text may be nil
        NSString *text = pasteboard.string;
    }
}