NSTableView Drag and Drop не работает - PullRequest
3 голосов
/ 13 января 2011

Я пытаюсь настроить очень простое перетаскивание для моего NSTableView. Табличное представление имеет один столбец (с пользовательской ячейкой). Столбец привязан к NSArrayController, а массив содержимого контроллера массива привязан к NSArray на моем объекте контроллера. Данные отлично отображаются в таблице. Я подключил выходы dataSource и delegate табличного представления к своему объекту контроллера, а затем реализовал эти методы:

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
{
    NSLog(@"dragging");
    return YES;
}

- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op
{
    return NSDragOperationEvery;
}

- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info
              row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation
{
    return YES;
}

Я также зарегистрировал типы перетаскивания в -awakeFromNib:

#define MyDragType @"MyDragType"

- (void)awakeFromNib
{
    [super awakeFromNib];
    [_myTable registerForDraggedTypes:[NSArray arrayWithObjects:MyDragType, nil]];
}

Проблема в том, что -tableView: writeRowsWithIndexes: toPasteboard: метод никогда не вызывается . Я посмотрел на несколько примеров, и я не могу понять, что я делаю неправильно. Может ли быть проблема в том, что я использую собственную ячейку? Что-то, что я должен переопределить в подклассе ячейки, чтобы включить эту функцию?

РЕДАКТИРОВАТЬ: Подтверждено. Переключение пользовательской ячейки для обычного NSTextFieldCell сделало работу перетаскивания. Теперь, как мне сделать так, чтобы перетаскивание работало с моей пользовательской ячейкой ?

Ответы [ 7 ]

3 голосов
/ 04 августа 2014

Я бился головой о стену в поисках более элегантного решения той же проблемы, а потом наткнулся на это:

http://www.wooji -juice.com / блог / какао-10-bindings.html

Например, если вы хотите поддерживать перетаскивание из таблицы, вам необходимо настроить источник данных для нее - даже если вы используете привязки для предоставления фактических данных, вы можете установить источник данных на это, и Какао нужен один для обработки tableView:writeRowsWithIndexes:toPasteboard и связанных сообщений.

Да. Если у вас есть все, что связано с вашим контроллером массива, вы можете сделать так, чтобы контроллер массива реализовал необходимые функции перетаскивания и затем установил источник данных табличного представления для контроллера массива с помощью setDataSource:.

2 голосов
/ 17 июля 2012

Что мне подходит, так это вызов initTextCell, а не init или initImageCell внутри инициализатора моей пользовательской ячейки (в моем случае init). Кажется, не имеет значения, является ли суперкласс NSCell или NSActionCell. Кроме того, у меня есть привязка, и перетаскивание все еще работает.

2 голосов
/ 13 января 2011

Я исправил проблему.Кажется, есть проблема с использованием привязок с пользовательскими NSCells в табличном представлении.Переход к традиционным методам NSTableViewDataSource вместо привязок и контроллера массива решил эту проблему.

1 голос
/ 13 января 2011

Этого должно быть достаточно, чтобы начать перетаскивание.Вы уверены , что вы подключили методы делегата?

0 голосов
/ 13 декабря 2014

Я столкнулся с проблемой.У меня есть подкласс NSCell, и я реализовал tableView:writeRowsWithIndexes:toPasteboard, и источник данных был установлен для NSTableView.Перетаскивание не будет работать.

Если я установлю тип ячейки в моем init для пользовательского подкласса

    self.type = NSTextCellType;

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

0 голосов
/ 10 сентября 2014

Я также наблюдаю подобную проблему, перетаскивание NStableView не работает.У меня есть 4 столбца в моем табличном виде, и два из них являются пользовательскими ячейками.Перетаскивание для нестандартной ячейки работает нормально, хотя оно работает и с разделителем ячеек, однако оно не работает с настраиваемыми ячейками.

Моя настраиваемая ячейка была разделена на подклассы из NSButtonCell, что вызывало проблему.Как и предполагалось, я изменил свой родительский класс с NSButtonCell на NSActionCell.Теперь перетаскивание работает отлично.

Он работает как с NSCell, так и с NSActionCell, однако мне потребовалось действие с моей ячейкой, поэтому я использовал NSActionCell.

0 голосов
/ 13 января 2011

Я столкнулся с этой проблемой, ваша пользовательская ячейка должна расширяться NSActionCell, а не NSCell, если вы хотите, чтобы перетаскивание работало правильно.Возможно, вы могли бы реализовать что-то в NSCell, чтобы это тоже работало, но я не стал копать дальше после перехода на NSActionCell.По крайней мере, это решило проблему для меня.

...