我想将浮点数复制到粘贴板中,但重要的是值,因为我想稍后将其粘贴为数字,作为数字。
试过:
[pasteboard setValue:SomeNSNumberWhereIStoredTheFloat forPasteboardType:@"NSNumber"];
有了它,它就没有什么可粘贴的了,而有了pasteboard.string = numberInStringValue,它将数字粘贴为一系列字符,我不感兴趣。
谢谢你的帮助
我想将浮点数复制到粘贴板中,但重要的是值,因为我想稍后将其粘贴为数字,作为数字。
试过:
[pasteboard setValue:SomeNSNumberWhereIStoredTheFloat forPasteboardType:@"NSNumber"];
有了它,它就没有什么可粘贴的了,而有了pasteboard.string = numberInStringValue,它将数字粘贴为一系列字符,我不感兴趣。
谢谢你的帮助
粘贴板数据的“类型”不是类的名称,它是统一类型标识符(UTI,或者如果您记得 UTI 还代表什么,则只是 UT。)在这种情况下,您的数据没有关联的 UTI(数字是抽象概念,而不是数据格式。)您必须找出存储该数字并检索它的最佳方法。
我认为在这种情况下,将数字格式化为字符串就足够了:
NSString *numString = [NSString stringWithFormat:@"%f", theFloatValue];
pasteboard.string = numString;
后来,当它回来时:
float theFloatValue2 = [pasteboard.string doubleValue];
这不考虑检查nil或其他错误处理。
如果您需要非常高的精度,您可能需要研究NSData基于存储技术。
可以NSNumber直接存储。您可以使用 API 中的以下方法
setValue:forPasteboardType:
使用此方法在粘贴板上放置一个对象,该对象是标准属性列表对象,它是 NSString、NSArray、NSDictionary、NSDate、NSNumber 或 NSURL 类的对象。
valueForPasteboardType:
此方法尝试返回一个对象,该对象属于与表示类型(通常是 UTI)相适应的类类型。例如,如果表示类型是 kUTTypePlainText (public.plain-text),则该方法返回一个 NSString 对象。如果该方法无法从表示类型确定类类型,则将对象作为通用属性列表对象返回。属性列表对象包括 NSString、NSArray、NSDictionary、NSDate 或 NSNumber 对象,也可以使用 NSURL 对象。如果该方法无法将值解码为属性列表对象,则它将粘贴板项作为 NSData 对象返回。
真正的问题在于找到正确的 UTI,因此课程会自动给你一个NSNumber而不是给你一个NSData对象。
更糟糕的是,代码似乎不像文档所宣传的那样工作。我从几个人那里听说过这个方法总会给你回报NSData。您可以在此答案中找到此类问题的示例(和解决方法)。
您可以将浮点值存储为 NSNumber。但是 NSNumber 没有正确存储在 UIPasteboard 中,尽管文档声明它确实(错误?)。
要将 NSNumber 保留在 UIPasteboard 中,您应该将 NSNumber 存档到 NSData,并且要从 UIPasteboard 检索 NSNumber,您应该将 NSData 解压缩回 NSNumber。
// adding data to pasteboard
NSNumber *number = [NSNumber numberWithDouble:floatValue]; // store your value here
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:number]; // archive NSNumber to NSData
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:data, @"yourKey",nil];
[[UIPasteboard generalPasteboard] addItems:[NSArray arrayWithObject:dict]];
// retrieving data
NSData *data = [dict valueForKey:@"yourKey"]; // here dict is properly obtained NSDictionary of pasteboard object
NSNumber *number = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // unarchive NSData to NSNumber