Writing a string to NSPasteBoard
Asked Answered
C

11

34

I cannot get this method to return YES:

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

I have verified that stringToWrite is coming through properly, the method just always returns NO.

Any ideas?

Here is the rest of the class:

@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];
}

@end

Cytogenetics answered 28/2, 2009 at 20:9 Comment(0)
C
38

Here is the working version of the method:

- (BOOL) writeToPasteBoard:(NSString *)stringToWrite
{
    [pasteBoard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
    return [pasteBoard setString:stringToWrite forType:NSStringPboardType];
}
Cytogenetics answered 28/2, 2009 at 20:26 Comment(3)
You should use nil for object pointers, NULL only for non-object pointers. Using the wrong one misleads the reader (who will be you six months from now).Kerry
Actually this code snippet came from an Apple provided example. I think they would know the right way to do things. But I digress, it is now changed to nil.Cytogenetics
Sometimes Apple examples are written hastily or were written a long time ago. Some of the "Sample Code" projects they provide contain crimes against nature. Things change, stale examples are forever. :-)Engrail
P
23

Before you copy a string on NSPasteboard it's better to clear the contents and then save.

Swift 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];

And also there are other available types for copying items on NSPasteboard. Like:

  • NSPasteboardTypeString
  • NSPasteboardTypePDF
  • NSPasteboardTypeTIFF
  • NSPasteboardTypePNG
  • NSPasteboardTypeRTF

You can find more details on https://developer.apple.com/documentation/appkit/nspasteboardtype.

Pentothal answered 14/2, 2018 at 13:8 Comment(0)
P
21

Swift 2:

Copy a string to the general pasteboard with Swift 2:

let pasteboard = NSPasteboard.generalPasteboard()
pasteboard.declareTypes([NSPasteboardTypeString], owner: nil)
pasteboard.setString("Hello", forType: NSPasteboardTypeString)
Pursy answered 20/1, 2016 at 14:37 Comment(0)
C
16

As of 10.6, the following implementation is also possible:

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

It's important to notice that #clearContents has to be called before something new can be written to the pasteboard, otherwise #writeObjects: keeps returning NO.

The new #writeObjects: methods is possible for objects that conform to the NSPasteboardWriting protocol. There's also an NSPasteboardReading Protocol, but using it wouldn't make the implementation any simpler.

Carrycarryall answered 10/4, 2012 at 12:2 Comment(1)
Thanks for clarifying the big gotcha: have to clear the clipboard before writing.Fujio
B
15

Apple is suggesting people move away from NSStringPboardType and use NSPasteboardTypeString instead.

Bargeman answered 21/3, 2012 at 8:53 Comment(1)
Agreed. But it's always better to write both types as legacy apps may not read the new one (NSPasteboardTypeString).Orcein
C
4

Swift 4 version:

NSPasteboard.general.clearContents()
NSPasteboard.general.setString("Hello World", forType: .string)
Cauda answered 17/10, 2017 at 9:10 Comment(0)
T
2

Swift 5

To copy a string in the clipboard you need to "prepare the pasteboard" before set string to copy

    NSPasteboard.general.prepareForNewContents()
    NSPasteboard.general.setString(stringToCopy, forType: .string)
Towns answered 19/12, 2022 at 23:11 Comment(0)
B
2

Swift 5,

let pasteBoard = NSPasteboard.general
pasteBoard.clearContents()
pasteBoard.setString("Test string",forType :.string)

Retrieve part,

NSTextField.pasteAsPlainText(NSPasteboard.general.string(forType:.string)
Babettebabeuf answered 12/1, 2023 at 9:37 Comment(0)
G
1

This works on Mojave 10.14.5 and does not use any deprecated APIs:

NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
[pasteboard declareTypes:[NSArray arrayWithObjects:NSPasteboardTypeString, nil] owner:nil];
[pasteboard setString:@"Hello clipboard!" forType:NSPasteboardTypeString];
Grapefruit answered 25/7, 2019 at 10:47 Comment(0)
H
1

For macOS 10.12 and later:

let pasteboard = NSPasteboard.general
pasteboard.prepareForNewContents()
pasteboard.writeObjects(["hello world" as NSString])
Horseshit answered 3/7, 2022 at 13:1 Comment(0)
P
0

For the record, to copy a string to the system clipboard, you can use

NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
[pasteBoard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
[pasteBoard setString:string forType:NSStringPboardType];
Pollock answered 10/9, 2015 at 18:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.