Запись строки в NSPasteBoard

Я не могу заставить этот метод возвращать 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];
}

@конец


person macinjosh    schedule 28.02.2009    source источник


Ответы (8)


Вот рабочая версия метода:

- (BOOL) writeToPasteBoard:(NSString *)stringToWrite
{
    [pasteBoard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
    return [pasteBoard setString:stringToWrite forType:NSStringPboardType];
}
person macinjosh    schedule 28.02.2009
comment
Вы должны использовать nil для указателей на объекты, NULL только для указателей, не являющихся объектами. Использование неправильного вводит в заблуждение читателя (который будет вами через шесть месяцев). - person Peter Hosey; 28.02.2009
comment
На самом деле этот фрагмент кода взят из примера, предоставленного Apple. Я думаю, они бы знали, как правильно поступать. Но я отвлекся, теперь он изменен на ноль. - person macinjosh; 01.03.2009
comment
Иногда примеры Apple написаны наспех или написаны давно. Некоторые из проектов Sample Code, которые они предоставляют, содержат преступления против природы. Вещи меняются, устаревшие примеры остаются навсегда. :-) - person Joshua Nozzi; 21.03.2012

Свифт 2:

Скопируйте строку в общий монтажный стол с помощью Swift 2:

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

Apple предлагает людям отказаться от NSStringPboardType и вместо этого использовать NSPasteboardTypeString.

person Jason Fuerstenberg    schedule 21.03.2012
comment
Согласованный. Но всегда лучше писать оба типа, так как устаревшие приложения могут не читать новый (NSPasteboardTypeString). - person Micha Mazaheri; 11.09.2014

Начиная с версии 10.6 также возможна следующая реализация:

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

Важно отметить, что #clearContents должен вызываться до того, как что-то новое может быть записано на монтажный стол, иначе #writeObjects: продолжает возвращать NO.

Новые методы #writeObjects: возможны для объектов, которые соответствуют протоколу NSPasteboardWriting. Также существует протокол NSPasteboardReading, но его использование не упростило бы реализацию.

person Karsten    schedule 10.04.2012
comment
Спасибо за разъяснение большой ошибки: перед записью необходимо очистить буфер обмена. - person M Katz; 18.11.2020

Прежде чем копировать строку на NSPasteboard, лучше очистить содержимое и затем сохранить.

Свифт 4

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

Цель-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.

person abdullahselek    schedule 14.02.2018

Свифт 4 версия:

NSPasteboard.general.clearContents()
NSPasteboard.general.setString("Hello World", forType: .string)
person Dave Wood    schedule 17.10.2017

Для записи, чтобы скопировать строку в системный буфер обмена, вы можете использовать

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

Это работает в Mojave 10.14.5 и не использует устаревшие API:

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