Warum ist nicht mein UIViewController in der responder-Kette für seine Ansicht?
Ich geschrieben habe, eine Unterklasse von UIViewController erstellt eine Ansicht programmgesteuert ändern, anstatt es zu laden aus einer NIB-Datei.
Es hat eine einfache loadView
Methode:
- (void)loadView
{
UIScrollView *mainScrollView =
[[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.view = mainScrollView;
[mainScrollView release];
}
...dann Mach ich den Großteil meiner Initialisierung in viewDidLoad
, wie dokumentiert. Es funktioniert alles, und ich kann sehen, die scroll-view mit meiner benutzerdefinierten Ansichten in ihm.
Ich brauche einen UIViewController, um die eigene Ansicht, weil es Teil eines UINavigationBar workflow. Da habe ich ein controller-Objekt, eher möchte ich es tun, der controller-Zeug.
Das problem, dann ist meine Ansicht-controller nicht zu sein scheinen in der responder-Kette. touchesBegan:withEvent:
der aufgerufen wird, wenn ich es definieren in der stammansicht oder einer Untersicht, auch wenn es nicht in der view-controller selbst.
Apple-event-handling-Dokumentation leichtfertig erwähnt die view-controller sollte in der responder-Kette. UIViewController Dokumentation sagt nichts über zusätzliche Schritte erforderlich, über die die Zuordnung der stammansicht zu der self.view
Eigenschaft, wie ich es getan habe vor. UIResponder Dokumentation behauptet, eine UIView müssen herausfinden, ob es einen controller, und übergeben Sie das Ereignis, um es. UIScrollView Dokumentation sagt gar nichts.
Habe ich experimentierte auch mit verschiedenen Einstellungen der userInteractionEnabled:
für alle sichten und Untersichten, ohne Glück.
Was bin ich?
- Ich habe da gelernt, dass wenn der root-view ist nichts außer ein UIScrollView, der view-controller wird in der responder-Kette. Ist UIScrollView kaputt?
- Diese Antwort ist hilfreich: stackoverflow.com/a/7808238/790198
Du musst angemeldet sein, um einen Kommentar abzugeben.
EricB, berührt, gesendet die responder-Kette nur, wenn Sie nicht behandelt wurden. UIScrollView offensichtlich kümmert sich um alle touch-events, so dass es nicht senden Sie alles, um es nextResponder. Macht perfekten Sinn für mich.
Was Sie eigentlich wollen, ist die "filter" - touch-Ereignisse, bevor Sie verarbeitet werden, der durch die Scroll-Logik der UIScrollView. Aber beachten Sie, dass die responder-Kette ist eine falsche tool für diesen job, genau deshalb, weil es nicht zulassen, dass das abfangen der Ereignisse, bevor Sie behandelt werden.
Wohl die beste Lösung in deinem Fall ist die Unterklasse UIScrollView, überschreiben Sie die touch-Methoden (touchesBegan etc) und manuell senden der Ereignisse an den Delegaten vor dem Aufruf
[super touchesXxx]
.Ich denke, das problem ist, dass UIScrollView hat eine Menge bugs und workarounds für die bugs, und bugs die workarounds für die bugs :).
Es ist kompliziert durch die Tatsache, dass Unterklassen UIScrollView ist in der Regel eine schlechte Idee, langfristig - oft müssen Sie Unterklasse es aus anderen Gründen, die nicht gelöst werden können, auf andere Weise, also, wenn Sie wollen, wieder verwenden Sie Ihre code, versuchen Sie nicht, Unterklasse, bis Sie absolut zu haben.
Einfachste Lösung, die ich gefunden habe, die konsequent arbeitet, um Ihren Inhalt anzuzeigen eine kleine UIView-Unterklasse - in Anbetracht Ihrer Inhalte Ansicht selbst ERFORDERLICH ist UIScrollView nie ändern (z.B. wenn Sie aktivieren die Zoom - Apple hat einige bugs, die bis zu mindestens iOS 6, der kick-in, wenn Sie ändern Sie den Inhalt anzeigen eines vorhandenen scrollview), so ist es eine gute Idee, halten Sie es einfach und stellen Sie Ihre benutzerdefinierten Ansichten im inneren, wie Untersichten.
NB: Dies hat bei mir immer funktioniert, auf mehrere apps ausgeliefert. Wenn es ein problem gibt, ich habe ihn noch nicht gesehen. Ich habe keine Ahnung, warum Apple nicht diese einfach umzusetzende sich selbst ändern, es sei denn, es ist ein subtiles problem, dass ich noch nicht auf noch!
Verwendung:
Interface-Datei + class-Datei:
UIScrollView verzögern Inhalte berührt standardmäßig aktiviert; habe Sie angeschaut -delaysContentTouches um sicherzustellen, dass die Berührungen Durchlaufen wird.