2012-06-10 14 views
5

Considerare una vista (parent) con una sottoview (child). Entrambi sono stati registrati per il tipo trascinato NSFilenamesPboardType.Superview come destinazione di trascinamento se la visualizzazione secondaria lo respinge

parent è interessato solo a file di immagine e child in file audio. Se rilevano un file del tipo corrispondente in draggingEntered: restituiscono NSDragOperationCopy. In caso contrario, restituiscono NSDragOperationNone.

child sovrappone parent e quando un trascinamento raggiunge child, parent riceve un messaggio draggingExited:, non importa se child è interessato alla resistenza oppure no.

Come posso rendere parent ricevere il trascinamento se child non lo desidera?

+0

Il 'child' ottiene sempre' draggingEntered: 'prima che' parent' abbia un 'draggingExited:' in questo caso? (o viceversa, sempre?) È importante sapere se l'ordine degli eventi è coerente al 100%.Se non è coerente al 100%, ciò rende la soluzione un po 'più complicata. – MechEthan

+0

È possibile condividere un'immagine/schema semplice che mostra il layout delle viste? – Alladinian

risposta

3

Se ho questo diritto si dovrebbe chiamare:

[self.superview yourmethod]; 

nella funzione del bambino.

Se il bambino ha ereditato dal genitore si può chiamare:

[super yourmethod]; 
+0

cos'è 'yourmethod'? – strangetimes

2

Ci sono un paio di cose che si potrebbero fare qui:

  1. Come accennato @Thomas, è possibile implementare la logica in la vista secondaria per determinare se gli eventi di trascinamento devono essere inoltrati o meno alla vista padre e inoltrare gli eventi quando appropriato.

  2. È possibile annullare la registrazione della vista secondaria dalla ricezione di messaggi di trascinamento ([childView unregisterDraggedTypes]) e quindi è possibile implementare tutta la logica per le interruzioni nella parentView. In sostanza, l'idea sarebbe di calcolare il tipo e la posizione del trascinamento e se si interseca o meno con la vista figlio. Se interseca la vista secondaria, applica la logica di trascinamento per la vista secondaria. Altrimenti, applica la logica di trascinamento per la vista genitore. Probabilmente sarà necessario implementare draggingUpdated: per fare ciò.

1

Si può considerare di rendere il genitore l'unico che si registra per NSFilenamesPboardType.

E come l'UIResponderChain, creare una categoria per ogni subviews

- (NSView*) dragTest:(id<NSDraggingInfo>)sender; 

se il valore restituito è pari a zero, significa che la visualizzazione secondaria (e le sue subivews) non desidera gestire l'evento di trascinamento.

Ora torna a parentview, quando draggingEntered: triggerato, calcola la posizione e scopri quale vista è attiva, chiama dragTest: per verificare se la corrispondente visualizzazione secondaria desidera gestirla. Consenti alla vista non nulla restituita di gestire l'evento, altrimenti gestirlo nel genitore.

Questo metodo sarà utile se si dispone di molti livelli di sotto-visualizzazioni.