2016-07-29 25 views
0

Folgende UIResponder Methoden berichten, roh berührt auf dem Bildschirm:Beeinträchtigt das Implementieren von UIResponder-Berührungsmethoden innerhalb einer UIView-Unterklasse MVC?

- touchesBegan:withEvent: 
- touchesMoved:withEvent: 
- touchesEnded:withEvent: 

Vor kurzem wurde ich mit einem UIView Unterklasse zu spielen, die ich wollte Berührung reagieren.

Zunächst implementierte ich die oben genannten Methoden in der UIViewController, die für die fragliche Ansicht verantwortlich war.

Allerdings erkannte ich, dass die Touch-Methoden aufgerufen wurden, wenn die UIViewControllers-Ansicht berührt wurde, nicht die Unteransicht, die ich wollte.

Ich implementiert die Methoden innerhalb einer UIView-Unterklasse und alles hat wie erwartet funktioniert.

Allerdings fühle ich mich wie MVC verletzt. Ich habe Kontrolllogik in meiner Sicht.

Sollte ich die in der UIViewController implementierten Methoden statt, und irgendwie Treffertest zu interpretieren, welche Ansicht berührt wurde, oder bin ich richtig die Methoden, die im Inneren des UIView Unterklasse implementiert?

Ich fühle mich wie der spätere ist der faule Ausweg.

Danke für Ihre Zeit.

+0

Sie sollten es in der Ansicht überschreiben. Wie sonst wäre Ihre Ansicht wiederverwendbar? Sie müssen die Touch-Behandlung für "UIButton" nicht in jedem View-Controller implementieren, der einen hat, der auf die Touch-Ereignisse selbst reagiert. – dan

+0

Verstößt dies nicht gegen MVC? – Woodstock

+3

Sie könnten definitiv Dinge innerhalb der Methoden tun, die gegen MVC verstoßen, aber das Überschreiben von ihnen verletzt MVC nicht an und für sich. 'UIView' ist aus einem bestimmten Grund eine Unterklasse von' UIResponder'. – dan

Antwort

1

In MVC ist die Ansicht für die Benutzerinteraktion verantwortlich. Daher ist es sinnvoller, Ihre UIResponder-Methoden in Ihrer UIView zu überschreiben. Um sich streng an MVC zu halten, sollten Sie dann einen delegate pattern (oder ein anderes Muster) verwenden, um die Steuerlogikfunktionen in Ihrem Controller aufzurufen.

enter image description here

Das obere Bild ist aus (Apple's MVC documentation). Der Teil, der zu Ihrer Frage gehört, befindet sich oben links. Die Ansicht sollte dem Controller mitteilen, dass er berührt wurde, und der Controller sollte die Logik ausführen.

Der UIViewController kann diese Methoden nur implementieren, da er mit einer integrierten Ansicht ausgestattet ist. Dies ist verwirrend, weil es bedeutet, dass der UIViewController selbst gegen MVC verstößt, aber das ist eine kompliziertere Diskussion.

+0

interessant, danke für die Antwort. Sollte mein UiView also die Aktualisierung des Mittelpunkts an den UIViewController delegieren? – Woodstock

+0

Ohne die Einzelheiten zu kennen, ist es schwierig für mich, Ihnen eine gute Antwort zu geben, aber wahrscheinlich nicht. Sie sollten sich fragen, was der viewController wirklich wissen muss. Ich schätze, dass Sie etwas Generischeres zurückgeben könnten. Abgesehen davon ist es schwierig, ein umfangreiches Projekt zu erstellen, das nur mit MVC arbeitet, und manchmal ist es für kleinere Projekte nicht die Zeit wert, alles auf die richtige Art und Weise zu tun.Sobald Sie anfangen zu bauen, werden Sie schließlich Probleme bekommen, die zeigen, warum es wichtig ist, bestimmte Entwurfsmuster zu verwenden, und das ist eine sinnvollere Art zu lernen. – CarlNathan