3

최선의 방법으로 코드를 리팩토링하려고하고 있는데, 주어진 상황에 적합한 아키텍처가 무엇인지 궁금합니다. 내가 뭘하는지UIView 또는 UIViewController 하위 클래스?

를 수행하기 위해 노력하고있어

은 매우 간단하다 : 나는 대화 형 UI 요소를 대표하는 일부 사용자 지정 CALayer 서브 클래스가 있습니다. UI의 일부는 정적이기 때문에 여러 레이어로 나뉘어져 있으므로 정적 요소를 불필요하게 다시 그리기를 원하지 않았습니다. 지금은 UIView의 하위 클래스 인 CustomView 클래스의 초기화 부분에서 하위 레이어로 레이어가 추가됩니다.

현재 내가 CustomView를 사용하고있을 때, 그것이 UITableViewCell 또는 다른 경관을 감상 할 수있는 일반적인 UIViewController의 일부에 포함 있기 때문에 UIViewController의 서브 클래스가 CustomViewController 클래스를 해당 없는있다, 그래서 나는 또 다른 느낌 각 CustomView 인스턴스에 대해 UIViewController이 중복 될 수 있습니다.

UIView 클래스 내부에서 수행하는 유일한 작업은 터치 이벤트에 응답하고 UI가 모양을 적절하게 업데이트 할 수 있도록 하위 레이어에 터치 정보를 보내는 것입니다. 나는 drawRect 메소드 또는 그와 비슷한 것을 오버라이드하지 않을 것이다.

옵션 1 :

CustomView 클래스 없애하는 CustomViewController 클래스를 생성

[질문 기본적으로

는, 나도 내가해야하는지 여부를 알아 내려고 노력하고있어 즉 UIViewController의 하위 클래스이며 CustomViewController에 내장 된 view 속성의 하위 레이어로 CALayer 개체를 추가하기 만하면됩니다.

또는

옵션 2 :

UIViewController 서브 클래스가 중복되는 대한 내 생각이 올바른지, 그래서 내가이 길을 떠나의 내부 CALayer 객체와 CustomView 클래스를 가져야한다 그것.

나는 이것에 대해 조언 해 주시면 고맙겠습니다.

+0

나는 과거와 똑같이 해왔다. 나는 또한 UIViewController 그것을했습니다. 코드가 유지 보수 가능하고 성능면에서 중요하지 않은 것 같습니다. UIViewController이 일을 더 "올바른"방법을 추측하지만 그것은 또한 특히 UITableViewCell 내부에 배치하는 경우 성능이 저하 될 수 있으며 거기에 많은 수 있습니다. – Fogmeister

+0

빠른 응답을 보내 주셔서 감사합니다. 반가워요. 'UIViewController '가 아닌 방법으로 현재 구현되고 있습니다. –

답변

0

MVC의 측면에서 설명하는 코드 (옵션 # 2)는 잘 작성되어 있으며 책임의 명확한 경계를 유지한다고 생각합니다. 이 클래스의 뷰 레이어 자체와 아무 관련이없는 코드를 작성할 필요가 없습니다. 이 경우에는 별도의 UIViewController 하위 클래스를 관리 할 필요가 없다고 당신이 말했듯이 - 자신의 터치 이벤트와 보이는 레이어 (정확하게 그들의 책임)를 처리하고 있기 때문입니다.

어떤 이유로 든 데이터 관련 논리 또는 다른 계산이 필요한 복잡한 것이 더 필요하면 UIViewController 서브 클래 싱을 고려하거나 전혀 다른 방식으로 문제를 조사하는 것이 좋습니다.

제시된 상황에서이 UIView 하위 클래스 ('CustomView') 내에 CALayer 인스턴스를 유지하는 것이 올바른 방법이라고 생각합니다.

+0

응답 해 주셔서 감사합니다! 아직 구현되지는 않았지만 UI 요소는 iCloud에서 저장 /로드 된 정보를 기반으로 애니메이션이 적용됩니다. iCloud를 사용할 것이므로 옵션 1에서 설명한'UIViewController' 메서드를 구현해야한다고 생각합니까? 옵션 1에 대한 대안은'CustomView * cv = [[CustomView alloc] initWithData : elementData];'와 같은 일을하는 것인데, 여기서 elementData는 이미'UITableViewController'에 의해로드 된 것입니다. 그러나 그 대안은 MVC 개념은 모델과의 시야를 혼합 한 것이기 때문에. –

+0

내 의견으로는, UIView의 하위 클래스는 'initWithData'메소드를 가져서는 안됩니다. 이것은 MVP 패러다임과의 모순이 의심의 여지가 없습니다. iCloud에서 데이터를 다운로드하려면 더 복잡한 것을 고려해야합니다. 다른 한편으로는, 예를 들어 캐시를 처리하는 많은 UIImageView 하위 클래스를 볼 수 있습니다. 캐시는 저장소와 관련이 있습니다 (보기 요소와 관련된 방식이 아닙니다). 이해할 수있는 코드를 유지하는 것이 중요하지만이 문제에는 명확한 "옳은"것과 "잘못된"이 있습니다. – Stavash

+0

게시 한 후에 UI 요소에 실제 데이터를 제공하는 대신 요소에 애니메이션을 적용해야하는 임의의 정수를 설정하는 메서드를 사용할 수 있다고 생각했습니다. 예를 들어'UITableViewCell'을 설정할 때 다음과 같이 할 수 있습니다 :'[[CustomView alloc] initWithValue : data.integerValue];'data는 'UITableViewController'와'integerProperty'에 의해로드 된 iCloud 데이터입니다. UI 요소의 모양과 직접적으로 일치하는 값입니다. MVC 패러다임의 무결성을 보존한다고 생각합니다. –

관련 문제