2013-04-05 2 views
1

Я пытаюсь реализовать функцию перетаскивания & в моем приложении, и я столкнулся с проблемой моего события mouseUp, не стреляющего. Он срабатывает просто отлично, если я просто нажимаю и отпускаю на моем представлении, но если я перетаскиваю, срабатывает событие mouseDragged , и все.mouseUp не стреляет в какао?

Пробуя разные вещи, я выяснил, что проблема в вызове dragImage, но пока я не знаю, как ее решить.

Вот мой код:

-(void) mouseDragged:(NSEvent *)theEvent 
{ 
    isDragging = YES; 

    if ([selectedCellRowIndex longValue] >= 0) 
    { 
     NSImage *im = [[NSImage alloc]initWithContentsOfFile:@"/Users/UserName/Desktop/drag.png"]; 
     NSSize dragOffset = NSMakeSize(0.0, 0.0); 
     NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; 

     [pboard declareTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:self]; 
     [pboard setData:[im TIFFRepresentation] forType:NSTIFFPboardType]; 

     [self dragImage:im 
        at:downPointRelativeToTable 
       offset:dragOffset 
       event:theEvent 
      pasteboard:pboard 
       source:self 
      slideBack:YES]; 
    } 
} 

Кто-нибудь знает, где моя проблема может быть ?! Спасибо!

+0

У вас есть прямоугольник отслеживания или область отслеживания на вид? У меня было что-то вроде этого некоторое время назад, где моя область отслеживания перемещала другой вид на место, и этот вид был, по сути, погружением перед событиями mouseUp:. –

+1

Кроме того, вы можете использовать [HIMouseTrackingGetParameters', чтобы избежать случайного распознавания кликов в качестве начала перетаскивания] (http://stackoverflow.com/a/1472834/30461). –

+0

@PeterHosey: нет ... У меня нет зон отслеживания. Что касается второго предложения, я попробую ... звучит интересно! Спасибо! –

ответ

2

В вашем фрагменте кода вы получаете экземпляр NSPasteboard, но не копируете свои данные на него. Это необходимо, в противном случае ваше сопротивление не будет инициировано должным образом - возможно, поэтому вы никогда не получите событие mouseUp:.

Документы для dragImage:at:offset:event:pasteboard:source:slideBack: состояния,

Перед вызова этого метода, необходимо поместить данные, которые будут переданы на pboard. Чтобы сделать это, возьмите объект перетаскивания (NSDragPboard), , объявите типы данных, а затем поместите данные в картон .

+0

Спасибо, Джей, это был определенно хороший улов! Я добавил: [pboard declareTypes: [NSArray arrayWithObject: NSTIFFPboardType] владелец: self]; [pboard setData: [im TIFFRepresentation] forType: NSTIFFPboardType]; к моему коду ... Тем не менее, это не устранило проблему :( –

+0

Хм .. это то, что я обычно забываю. Если он по-прежнему не отображается в виде перетаскивания, вы регистрировали задействованные координаты (в частности, 'downPointRelativeToTable')? Может быть, это просто вне экрана. – Jay

1

Я видел это с простым потомком NSView. На mouseDown была начата операция перетаскивания, и mouseUp никогда не запускался. Вместо этого вызов супер блокируется до тех пор, пока операция перетаскивания не будет выполнена (очевидно, будет цикл локального запуска). Следовательно, я должен был поместить мою обработку mouseUp в функцию mouseDown после вызова, возвращенного из супер.

+0

Локальные runloops для обработки перетаскивания [обычно обескуражены] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html#//apple_ref/doc/uid/10000060i-CH6-SW18), так как основной поток приложения не может обрабатывать другие запросы во время цикла отслеживания событий, и таймеры могут не срабатывать, как ожидалось (хотя, например, пример Sketch обрабатывает операции перетаскивания таким образом, так что вы идете ..) – Jay

Смежные вопросы