nsnumber到uipasteboard

时间:2012-08-11 01:22:38

标签: objective-c ios nsnumber uipasteboard

我想将一个浮动复制到粘贴板中,但重要的是值,因为我想稍后将其粘贴在数字中,作为数字。

试过:

[pasteboard setValue:SomeNSNumberWhereIStoredTheFloat forPasteboardType:@"NSNumber"];

有了它,它没有任何东西可以粘贴,而pasteboard.string = numberInStringValue,它会将数字粘贴为一系列字符,这些都是我不感兴趣的。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

粘贴板数据的“类型”不是类的名称,它是Uniform Type Identifier(UTI,或者只是UT,如果你还记得UTI代表的其他内容。)在这种情况下,你的数据没有关联的UTI(数字是抽象概念,而不是数据格式。)您必须找出存储该数字并检索它的最佳方法。

我认为在这种情况下,将数字格式化为字符串就足够了:

NSString *numString = [NSString stringWithFormat:@"%f", theFloatValue];
pasteboard.string = numString;

后来,当它回来时:

float theFloatValue2 = [pasteboard.string doubleValue];

这不会考虑检查nil或其他错误处理。

如果您需要非常高的精度,则可能需要调查基于NSData的存储技术。

答案 1 :(得分:0)

您可以直接存储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。您可以在此answer中找到此类问题的示例(以及解决方法)。

答案 2 :(得分:0)

您可以将浮动值存储为NSNumber。 但是NSNumber没有正确存储在UIPasteboard中,尽管文档说明了它(bug?)。

要将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