2012-06-10 10 views
5

Rozważ widok (parent) z podziałem (child). Oba zostały zarejestrowane dla typu przeciągniętego NSFilenamesPboardType.Superview jako miejsce przeciągania, jeśli subview go odrzuca.

parent jest zainteresowany tylko plikami obrazów i child w plikach audio. Jeśli wykryją plik odpowiedniego typu w draggingEntered:, zwrócą one NSDragOperationCopy. Jeśli nie, zwracają NSDragOperationNone.

child pokrywa parent a kiedy osiągnie child drag, parent otrzymuje wiadomość draggingExited:, bez względu na to czy jest zainteresowany child przeciągania czy nie.

Jak mogę sprawić, by parent otrzymał opór, jeśli nie chce tego child?

+0

Czy "dziecko" zawsze dostaje 'przeciągnięcieEntered:' zanim 'rodzic' otrzyma' przeciągnięcieExited: 'w tym przypadku? (lub odwrotnie, zawsze?) Ważne jest, aby wiedzieć, czy kolejność zdarzeń jest w 100% spójna.Jeśli nie jest w 100% spójny, to sprawia, że ​​rozwiązanie jest nieco bardziej skomplikowane. – MechEthan

+0

Czy można udostępnić prosty obraz/schemat przedstawiający układ widoków? – Alladinian

Odpowiedz

3

Jeśli dostanę tego prawa należy zadzwonić:

[self.superview yourmethod]; 

w funkcji Childs.

Jeśli dziecko dziedziczone od rodziców można nazwać:

[super yourmethod]; 
+0

co to jest 'Your Metod'? – strangetimes

2

Istnieje kilka rzeczy można zrobić tutaj:

  1. Jak wspomniano @Thomas, można wdrożyć w logikę widok podrzędny, aby określić, czy zdarzenia przeciągania powinny zostać przekazane do widoku macierzystego i przekazać zdarzenia, jeśli jest to właściwe.

  2. Można wyrejestrować widok podrzędny z wiadomości odbierających przeciąganie ([childView unregisterDraggedTypes]), a następnie zaimplementować całą logikę przeciągania w parentView. Zasadniczo chodziło o to, aby obliczyć typ i pozycję przeciągnięcia i czy przecina się on z widokiem potomnym. Jeśli przecina się z widokiem potomnym, zastosuj logikę przeciągania dla widoku podrzędnego. W przeciwnym razie zastosuj logikę przeciągania dla widoku nadrzędnego. Prawdopodobnie będziesz musiał wykonać implementację draggingUpdated:, aby to osiągnąć.

1

Można rozważyć sprawić, że rodzic jako jedyny zarejestruje się w NSFilenamesPboardType.

I jak UIResponderChain utworzyć kategorie dla każdego subviews

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

czy zwrócona wartość jest zerowa, to znaczy, że subview (i jego subivews) nie chce obsłużyć zdarzenia przeciągania.

Teraz wróć do widoku nadrzędnego, przeciągnij Wyśrodkowany: wyzwolony, obliczyć lokalizację i dowiedzieć się, który widok jest włączony, zadzwoń do dragTest: aby sprawdzić, czy odpowiadający mu podgląd chce go obsłużyć. Niech zwracany widok inny niż pusty obsłuży zdarzenie, w przeciwnym razie obsłuży go w obiekcie nadrzędnym.

Ta metoda będzie pomocna, jeśli masz wiele poziomów subskrybentów.

Powiązane problemy