2011-10-09 11 views
5

Tengo un NSTableView que contiene una cantidad de elementos. Me gustaría implementar el arrastre desde dentro de y soltar fuera de de NSTableView para eliminar el elemento arrastrado. (Algo así como la forma en marcadores 'Poofs' Safari de distancia.)Arrastrando desde NSTableView para quitar

El NSTableView ya está configurado para soportar la fricción n' reordenamiento gota, y acepta las gotas de otro NSTableView en la aplicación, así que mientras que la mayor parte se cablea, me Me falta una pequeña funcionalidad.

Actualización:

Gracias a Sean por su ayuda hasta ahora. Si bien puedo recibir notificaciones de que un elemento ha sido arrastrado después de que ha flotado hacia atrás a su posición original (ver comentario a su respuesta), me gustaría recibir una notificación inmediatamente una vez que se suelta el botón del mouse.

El comportamiento actual es que el usuario arrastre y suelte un elemento, que el arrastre sea tratado como "no válido" y que el elemento vuelva a su posición original. Luego, se recibe la notificación, y puedo eliminar el elemento, pero es un poco confuso (para los usuarios) desde el punto de vista de la interfaz de usuario.

Respuesta

9

Parece que su vista de tabla ya está implementando el protocolo NSDraggingSource. En este caso, puede agregar el método draggedImage:endedAt:operation: (pre OS 10.7) o draggingSession:endedAtPoint:operation: (OS 10.7) que proporcionará la operación NSDragOperationNone en el argumento operation si el arrastre falló. Por lo tanto, puede verificar si se pasó esta operación, luego eliminar el objeto y eliminarlo de la vista si es así.

En otras palabras, se vería algo como esto (en 10.7):

-(void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation { 
    if (operation == NSDragOperationNone) { 
     //delete object, remove from view, etc. 
    } 
} 
+1

¿Deben definirse estos métodos en NSTableView o en el objeto que actúa como delegado/origen de datos? No necesité subclasificar el NSTableView para proporcionar el nivel actual de funcionalidad de arrastre, simplemente implementé algunos métodos de delegado y llamé a registerForDraggedTypes: La implementación de los métodos de arrastre que recomendó en la fuente de datos/delegado no pareció funcionar, pero los probaré en versiones subclases de las NSTableViews. –

+1

Funcionó al agregarlos al NSTableView subclasificado, pero el problema es que la aplicación trata el arrastre como "malo", y la imagen flota de nuevo a su ubicación original, * luego * se invocan los métodos anteriores. ¿Alguna forma de recibir una notificación inmediatamente cuando se suelta el botón del mouse? –

+1

Pude descifrar esa última parte. En mi NSTableView subclasificado, simplemente sobreescribo: ** dragImage: at: offset: event: pasteboard: source: slideBack: ** y luego pasé ese método a [super ...], mientras cambiaba el parámetro slideBack: a NO. –

4

Para evitar la imagen de arrastre flotante de nuevo a su ubicación original antes de la eliminación, se puede establecer la propiedad de sesión arrastrando "animatesToStartingPositionsOnCancelOrFail "en el tableView: draggingSession: willBeginAtPoint: forRowIndexes: método:

- (void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes { 
    [session setAnimatesToStartingPositionsOnCancelOrFail:NO]; 
} 

Sin embargo, estoy buscando todavía método para crear el 'puf' cuando se elimina una fila arrastrada.

+0

No es un método, sino una función: ['NSShowAnimationEffect'] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Miscellaneous/AppKit_Functions/Reference/reference.html#// apple_ref/c/func/NSShowAnimationEffect) –

+2

Gracias por eso Peter.Ahora estoy usando esto: NSShowAnimationEffect (NSAnimationEffectPoof, [NSEvent mouseLocation], NSZeroSize, nil, nil, nil); – SarahR

+0

¿cómo puedo averiguar en este método qué es la operación de arrastre? cuando haces esto [session setAnimatesToStartingPositionsOnCancelOrFail: NO]; siempre no retrocede ... pero solo quiero esto cuando elimino una fila ... La segunda pregunta es, quiero simplemente borrar la fila cuando mi artículo arrastrado esté fuera de la ventana de mi aplicación ... debería ser posible con endedAtPoint, pero no tengo idea de cómo? espero que puedas ayudar :) – Missaq

Cuestiones relacionadas