2011-01-13 3 views
3

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

- (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: метод никогда не назывался. Я просмотрел множество примеров, и я не могу понять, что я делаю неправильно. Может ли проблема заключаться в том, что я использую пользовательскую ячейку? Есть ли что-то, что я должен переопределить в подклассе ячеек, чтобы включить эту функцию?

EDIT: Подтверждено. Переключение пользовательской ячейки для обычной работы по перетаскиванию NSTextFieldCell. Теперь, Как сделать перетаскивание с моей пользовательской ячейкой?

+0

Вы отлаживали и * проверяли * источник данных и делегировать членов вашего 'NSTableview' подключены, как ожидалось? – cacau

+0

Это вопрос с 2011 года, с тех пор я решил эту проблему: http://stackoverflow.com/a/4676823/153112. – indragie

ответ

2

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

+0

Переключение на традиционный NSTableViewDataSource означает не использование пользовательских NSCells? –

+0

Нет, это просто означает, что вы не можете использовать привязки. Вы все еще можете использовать пользовательские ячейки – indragie

1

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

+0

Я проверил дважды, зарегистрировав источник данных и делегат из объекта NSTableView, и я уверен, что они связаны. Мне удалось выяснить этот вопрос. Я переключил свою пользовательскую ячейку на текстовую ячейку и перетащил ее. Есть ли что-нибудь, что я должен сделать для своего подкласса NSCell, чтобы включить перетаскивание? – indragie

+0

Какие настройки вы внесли в ячейку? Сделали ли вы что-нибудь обычай с отслеживанием мыши? –

0

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

+1

Не работает для меня –

2

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

3

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

http://www.wooji-juice.com/blog/cocoa-10-bindings.html

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

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

+0

Это был правильный ответ для меня, спасибо. У меня было именно это, контроллер массива. Когда я устанавливаю таблицу для использования класса контроллера массива в качестве источника данных, перетаскивание начинает работать –

0

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

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

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

0

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

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

self.type = NSTextCellType; 

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