Перетащите данные строки из приложения My Cocoa в стороннее приложение Cocoa - PullRequest
2 голосов
/ 22 декабря 2010

Я хочу перетащить строку из моего табличного представления и поместить ее в любой другой NSTextField в Mac OS X 10.6, и у меня будет пропущена строка текста.

Перетаскивание уже работает в моем приложении (между NSTableView и NSBrowser), но у меня не получилось поместить какие-либо данные на монтажную панель, которые могут быть приняты приложениями, отличными от исходного приложения.

Вот код, который я попробовал, и который, как мне показалось, будет достаточно, чтобы слово «привет» можно было «вставить», когда я заскочил в какой-нибудь другой NSTextField:

-(BOOL) tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes     toPasteboard:(NSPasteboard *)pboard {

    [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
    [pboard setString:@"hello" forType:NSStringPboardType];

return YES;

}

// -

Я никогда не получаю курсор, который показывает мне, что падение будет принято, и оно просто не работает.

  • Вещи, которые я пробовал:
    • Используя версию 10.5 идентификатора Pasteboard, NSStringPBoardType
    • Использование версии 10.6, NSPasteboardTypeString.
    • Установка владельца = ноль, поскольку я не предоставляю данные лениво.
    • Использование архиватора с ключами: [pboard setData: [NSKeyedArchiver archivedRootObject: @ "Hello !!"]]

Ничего из вышеперечисленного не сработало. Я думаю, что у меня есть правильные концепции: «Кодировать данные, сообщать монтажному блоку, что у вас есть, а затем передавать данные», но, поскольку другие приложения не распознают его, я подозреваю, что не сообщаю монтажному щиту правильный тип данных ,

Куда я иду не так?

Спасибо, Древесный

1 Ответ

6 голосов
/ 01 января 2011

Добавьте это в awakeFromNib:

- (void)awakeFromNib {
    [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
    // [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];

}

класса вашего контроллера (предполагается, что у вас IBOutlet подключен к вашему tableView с именем tableView).Обязательно сделайте это в awakeFromNib или позже.(Например, если бы вы попытались сделать это в методах init вашего класса контроллера, ваши nib-файлы еще не были бы полностью загружены, а ваши IBOutlet были бы nil, и сообщение могло бы иметьбез эффекта).

По умолчанию большинство операций перетаскивания будет ограничено локальным приложением, а не всеми приложениями.Параметр forLocal: указывает, имеете ли вы в виду операции перетаскивания, локальные для приложения (в том же приложении) или нелокальные, то есть все приложения.Закомментированная строка - это в основном то, что у вас уже есть tableView.

...