Erklärung der Kette von Uirsponder benötigt
-
27-10-2019 - |
Frage
Ich habe Probleme, meine zu bekommen UIButtons
, UIScrollViews
usw. in dieser Situation arbeiten:
Ich habe die Basis UIViewController
, das ist der Wurzelcontroller der UIWindow
. Über dieser Schicht habe ich andere UIViews
Hinzugefügt, was ich die "mittlere Schichtansicht" nennen werde. Und oben habe ich noch einen UIView
Für Overlay -Objekte hinzugefügt.
Die mittlere Schichtansicht wird für verschiedene Ansichten regelmäßig geändert. Das UIView
es verwendet ist von a UIViewController
, gemacht von einer NIB -Datei. Hier ist ein Beispiel
if ( mode == eModeShowView1 )
UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View1"...
else if ( mode == eModeShowView2 )
UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View2"...
[UIView insertSubview:nextController.view below:m_overlayView];
Wenn ich jetzt auf dem Bildschirm berühre, ist der Ersthelfer offensichtlich der OverlayView
oder irgendein UIResponder
auf der OverlayView
Das wurde berührt. Das UIEvent
der Berührungseingabe geht die Ansichtskette nach oben, scheint aber die mittlere Schichtansicht und die zu überspringen UIResponders
auf diesem UIView
insgesamt. Es springt direkt zur Wurzel UIViewController
.
Weiß jemand, was hier los ist?
Könnte es gelöst werden, indem er irgendwie zwei erstellt UIEvents
? Eine für die Overlay -Ansicht und eine für die mittlere Schichtansicht? Ist das möglich? Wenn das so ist, wie?
Jede Hilfe wäre am meisten geschätzt. Danke, reich
Lösung
edit1 Start:
Sie können den M_OverlayView und initWithTarget: Ihre Middleview-Aktion: SOME-Methode-in-Middleview einen Uitapgester-Ekognizer einsetzen: Ihre Middleview-Aktion
In Ihrem MiddleView können Sie nun erkennen.
edit1 Ende:
Sie können es debuggen. Verwenden Sie einfach die Protokolle in touchesbegan
In all Ihren Controllern. Es wird durch Protokolle der Abfolge der Berührungsantworten klar sein.
OK .. Also kann diese Beschreibung der Methode aus der Dokumentation Sie beantworten. Dein m_overlayView
und nextController.view
sind einander als Geschwister und nicht als Übersicht. Ihre Berührung bei einem von ihnen wird also nicht dem anderen, sondern der Basis gemeldet superview
Das ist üblich superview
zu beiden Geschwistern.
Daher bekommen Sie, dass die mittlere Schicht umgangen wird. Eigentlich ist Ihre Mittelschicht ein Geschwister und kein Überblick mehr. Hoffe das gibt dir zumindest einen Weg voraus;)
insertSubview:belowSubview:
Fügt eine Ansicht unter einer anderen Ansicht in die Ansichtshierarchie ein.
(void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview
Parameter:
view
Die Ansicht, die unter einer anderen Ansicht einfügt. Es ist von seinem entfernt superview
Wenn es kein Geschwister von Geschwistern ist.
Geschwistern:
Die Geschwisteransicht, die über der eingefügten Ansicht liegt.
Diskussion:
Diese Methode behält die Ansicht bei und setzt ihren nächsten Responder auf den Empfänger, der neue ist superview
.
Ansichten können nur eine Übersicht haben. Wenn die Ansicht bereits eine hat superview
Und diese Ansicht ist nicht der Empfänger, diese Methode entfernt die vorherige Methode superview
Bevor der Empfänger neu macht superview
.