2011-05-05 10 views
7

tengo una subclase NSView que registra para arrastrar los archivos en el método init así:cacao NSView subvista arrastre bloqueo/drop

[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 

La caída de arrastre funciona perfectamente bien, pero si añado una subvista a este punto de vista con el mismo cuadro exacto, ya no funciona. Mi suposición es que la subvista es bloquear el evento de arrastre para ir a la súper vista. ¿Puedo evitar eso? Gracias

Además, sé que estoy haciendo dos preguntas, pero no quiero crear un tema nuevo solo para esto: cuando estoy arrastrando, mi cursor no cambia al signo "+" como con otras Drags, ¿cómo puedo hacer eso? Gracias de nuevo.

ACTUALIZACIÓN: Aquí está la forma en que lo tengo instalado en mi IB: enter image description here

El DrawView es la clase personalizada que estaba hablando de la registrada en draggedtypes. Y la vista de imagen, simplemente es una vista secundaria, me arrastré una imagen de la sección de medios de comunicación ... Si ayuda, aquí está mi código relevante para DragView:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    return NSDragOperationCopy; 
} 

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender { 
    NSPasteboard *pboard; 
    pboard = [sender draggingPasteboard]; 
    NSArray *list = [pboard propertyListForType:NSFilenamesPboardType]; 
    if ([list count] == 1) { 
     BOOL isDirectory = NO; 
     NSString *fileName = [list objectAtIndex:0]; 
     [[NSFileManager defaultManager] fileExistsAtPath:fileName 
              isDirectory: &isDirectory]; 
     if (isDirectory) { 
      NSLog(@"AHH YEA"); 
     } else { 
      NSLog(@"NOO"); 
     } 
    } 
    return YES; 
} 
+0

Cómo estás creando la subvista? Puedo arrastrarme a una vista con una subvista creada a través de IB o programáticamente. –

+0

Tengo la vista configurada en IB. Configuré su clase a la clase personalizada que describí arriba. Luego, en IB, arrastro una imagen y la coloco dentro de esa vista (la hago una subvista). Cuando hago eso, el arrastre deja de funcionar. Gracias. – user635064

+0

Se actualizó la pregunta original que proporciona más detalles. Gracias. – user635064

Respuesta

4

La respuesta a la segunda parte de su pregunta es la siguiente :

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{ 
    return NSDragOperationCopy; 
} 

si regresa NSDragOperationCopy, se obtiene el distintivo de ratón para una operación de copia. (Puede y debe, por supuesto, no solo devolver NSDragOperationCopy incondicionalmente, compruebe los objetos en el portapapeles para ver si puede aceptarlos)

No estoy seguro de cuál es la respuesta a la primera parte de su pregunta , porque no puedo recrear el efecto de bloqueo de la subvista.

Bien, la respuesta es desafortunadamente que no se puede. La imagen que arrastró está contenida en NSImageView, y NSImageView s aceptan arrastrar eventos ellos mismos, por lo que está tomando el evento de arrastre y no hacer nada con él. Si su subvista era una clase personalizada, podría: a) no implementar arrastrar y soltar, en cuyo caso se arrastrarían los arrastres ; b) implementar arrastrar y soltar para aceptar drags para la subvista. En este caso, estás usando una clase sobre la cual no tienes ningún control. Si todo lo que quiere que haga es mostrar una imagen, usted debería ser capaz de hacer otra subclase NSView que no hace más que dibujar la imagen en drawRect:

+0

Gracias por la entrada, funcionó perfectamente. Principal mi pregunta fue la primera pregunta, por eso no lo estoy marcando como aceptado, pero lo estoy hojeando. Gracias de nuevo. – user635064

+0

Con esos detalles, tengo el resto de tu respuesta. Buena suerte, gracias por el voto popular! –

+0

¡Muchas gracias por aclarar! – user635064