【问题标题】:nsnumber into uipasteboardnsnumber 到 uipasteboard
【发布时间】:2012-08-11 01:22:37
【问题描述】:

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

试过了:

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

这样,它就没有什么可粘贴的了,而对于 pasteboard.string = numberInStringValue,它会将数字粘贴为一系列字符,我不感兴趣。

感谢您的帮助

【问题讨论】:

    标签: objective-c ios nsnumber uipasteboard


    【解决方案1】:

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

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

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

    然后,当它回来时:

    float theFloatValue2 = [pasteboard.string doubleValue];
    

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

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

    【讨论】:

    • 这是我尝试过的,但我需要将数字粘贴到数字表中,将其视为数字。这就是为什么 pasteboard.string 对我不起作用,我以后无法取回它。还是谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以将浮点值存储为 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多