2016-07-29 8 views
0

다음 UIResponder 방법은 화면에 원시 터치를보고 : 최근에 내가 반응하는 터치 할 싶었던 UIView 서브 클래스와 함께 연주했다UIView 하위 클래스에서 UIResponder 터치 메소드를 구현해도 MVC가 위반됩니까?

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

.

처음에는 문제의 뷰를 담당 한 UIViewController에 위의 메소드를 구현했습니다.

그러나 UIViewControllers 뷰를 터치 할 때마다 터치 메소드가 호출되고 있음을 알았습니다. 원하는 서브 뷰가 아닙니다.

UIView 하위 클래스 내에서 메서드를 다시 구현했으며 모든 것이 예상대로 작동했습니다.

그러나 MVC를 위반하는 것 같습니다. 내 시각에는 통제 논리가 있습니다.

내가 대신의 UIViewController 내부에 구현 된 방법을 유지하고 있어야 어떻게 든 히트 테스트 접촉, 또는 UIView의 서브 클래스 내에서 구현 된 방법을 가지고에서 내가 해결 오전 한보기 해석?

나는 게으른 탈출구 인 것처럼 느낍니다.

감사합니다.

+0

보기에서이를 대체해야합니다. 당신의 견해를 어떻게 재사용 할 수 있습니까? 하나의 뷰 컨트롤러에 'UIButton'에 대한 터치 처리를 구현할 필요가 없으며 터치 이벤트 자체에 응답합니다. – dan

+0

MVC를 위반하지 않습니까? – Woodstock

+3

MVC를 위반하는 메서드 내에서 확실히 할 수 있지만 재정의하면 MVC 자체에 위배되지 않습니다. 'UIView'는 이유로 UIResponder의 하위 클래스입니다. – dan

답변

1

MVC에서보기는 사용자 상호 작용을 담당합니다. 따라서 UIView에서 UIResponder 메서드를 재정의하는 것이 더 중요합니다. MVC를 엄격하게 유지하려면 delegate pattern (또는 다른 패턴)을 사용하여 컨트롤러에있는 제어 논리 함수를 호출해야합니다.

enter image description here

상기 이미지 (Apple's MVC documentation)에서이다. 귀하의 질문과 관련된 부분은 왼쪽 상단에 있습니다. 뷰는 컨트롤러에이를 알려주고 컨트롤러는 로직을 실행해야합니다.

UIViewController는 기본 제공 뷰와 함께 제공되므로 이러한 메서드를 구현할 수 있습니다. 이것은 UIViewController 자체가 MVC를 위반한다는 것을 의미하기 때문에 혼란 스럽습니다. 그러나 더 복잡한 토론입니다.

+0

흥미 롭습니다. 답장을 보내 주셔서 감사합니다. 그래서 내 UiView, UIViewController 중심점 업데이트 다시 위임해야합니까? – Woodstock

+0

세부 사항을 모르면 나에게 당신에게 큰 대답을하기는 어렵지만 아마 그렇지 않을 것이다. viewController가 실제로 알아야 할 것이 무엇인지 스스로에게 물어야한다. 제 생각으로는 좀 더 일반적인 것을 되돌릴 수 있습니다. 즉, MVC만을 고집하는 규모가 큰 프로젝트를 만드는 것은 어렵고 때로는 소규모 프로젝트의 경우 모든 것을 '올바른'방식으로 수행 할 가치가없는 프로젝트라고 생각합니다.일단 건물을 시작하면 궁극적으로 특정 디자인 패턴을 사용하는 것이 왜 중요한지를 보여줄 수있는 문제에 빠지기 시작합니다. 이는 더 의미있는 학습 방법입니다. – CarlNathan