【问题标题】:Writing a string to NSPasteBoard将字符串写入 NSPasteBoard
【发布时间】:2010-10-10 13:26:42
【问题描述】:

我无法让这个方法返回 YES:

- (BOOL) writeToPasteBoard:(NSString *)stringToWrite
{
    return [pasteBoard setString:stringToWrite forType:NSStringPboardType];
}

我已验证 stringToWrite 正确通过,该方法总是返回 NO。

有什么想法吗?

这是课程的其余部分:

@interface ClipBoard : NSObject {
    NSPasteboard *pasteBoard;
}

- (BOOL) writeToPasteBoard:(NSString *)stringToWrite;
- (NSString *) readFromPasteBoard;
@end

@implementation ClipBoard
- (id) init
{
    [super init];
    pasteBoard = [NSPasteboard generalPasteboard];
    return self;
}

- (BOOL) writeToPasteBoard:(NSString *)stringToWrite
{
    return [pasteBoard setString:stringToWrite forType:NSStringPboardType];
}

- (NSString *) readFromPasteBoard
{
    return [pasteBoard stringForType:NSStringPboardType];
}

@结束

【问题讨论】:

    标签: cocoa xcode pasteboard


    【解决方案1】:

    这是该方法的工作版本:

    - (BOOL) writeToPasteBoard:(NSString *)stringToWrite
    {
        [pasteBoard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
        return [pasteBoard setString:stringToWrite forType:NSStringPboardType];
    }
    

    【讨论】:

    • 你应该使用 nil 作为对象指针,NULL 只用于非对象指针。用错了会误导读者(六个月后你会是谁)。
    • 实际上这段代码 sn-p 来自 Apple 提供的示例。我想他们会知道做事的正确方法。不过我跑题了,现在改成nil了。
    • 有时Apple的例子写得仓促,或者是很久以前写的。他们提供的一些“示例代码”项目包含危害自然的罪行。事情在变,陈旧的例子永远存在。 :-)
    【解决方案2】:

    Apple 建议人们远离 NSStringPboardType 并改用 NSPasteboardTypeString。

    【讨论】:

    • 同意。但最好同时编写这两种类型,因为旧版应用程序可能无法读取新的类型 (NSPasteboardTypeString)。
    【解决方案3】:

    从 10.6 开始,以下实现也是可能的:

    - (BOOL) writeToPasteBoard:(NSString *)stringToWrite
    {
        [pasteBoard clearContents];
        return [pasteBoard writeObjects:[NSArray arrayWithObject:stringToWrite]];
    }
    

    请务必注意,必须先调用 #clearContents 才能将新内容写入粘贴板,否则 #writeObjects: 会一直返回 NO。

    新的#writeObjects: 方法适用于符合 NSPasteboardWriting 协议的对象。还有一个 NSPasteboardReading 协议,但使用它不会使实现变得更简单。

    【讨论】:

    • 感谢您澄清一个大问题:在写作之前必须清除剪贴板。
    【解决方案4】:

    为了记录,要将字符串复制到系统剪贴板,可以使用

    NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
    [pasteBoard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
    [pasteBoard setString:string forType:NSStringPboardType];
    

    【讨论】:

      【解决方案5】:

      斯威夫特 2:

      使用 Swift 2 将字符串复制到通用粘贴板:

      let pasteboard = NSPasteboard.generalPasteboard()
      pasteboard.declareTypes([NSPasteboardTypeString], owner: nil)
      pasteboard.setString("Hello", forType: NSPasteboardTypeString)
      

      【讨论】:

        【解决方案6】:

        Swift 4 版本:

        NSPasteboard.general.clearContents()
        NSPasteboard.general.setString("Hello World", forType: .string)
        

        【讨论】:

          【解决方案7】:

          NSPasteboard 上复制字符串之前,最好清除内容然后保存。

          斯威夫特 4

              // Set string
              NSPasteboard.general.clearContents()
              NSPasteboard.general.setString("I copied a string", forType: .string)
              // Read copied string
              NSPasteboard.general.string(forType: .string)
          

          Objective-C

              // Set string
              [[NSPasteboard generalPasteboard] clearContents];
              [[NSPasteboard generalPasteboard] setString:@"I copied a string" forType:NSPasteboardTypeString];
              // Read string
              [[NSPasteboard generalPasteboard] stringForType:NSPasteboardTypeString];
          

          还有其他可用类型可用于在 NSPasteboard 上复制项目。喜欢:

          • NSPasteboardTypeString
          • NSPasteboardTypePDF
          • NSPasteboardTypeTIFF
          • NSPasteboardTypePNG
          • NSPasteboardTypeRTF

          您可以在https://developer.apple.com/documentation/appkit/nspasteboardtype找到更多详细信息。

          【讨论】:

            【解决方案8】:

            这适用于 Mojave 10.14.5,并且不使用任何已弃用的 API:

            NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
            [pasteboard declareTypes:[NSArray arrayWithObjects:NSPasteboardTypeString, nil] owner:nil];
            [pasteboard setString:@"Hello clipboard!" forType:NSPasteboardTypeString];
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-03
              • 1970-01-01
              • 2011-10-24
              • 2016-05-14
              • 2012-09-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多