我想将浮点数复制到粘贴板中,但重要的是值,因为我想稍后将其粘贴为数字,作为数字。
试过:
[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