Q & A
글수 1,561
안녕하세요. 많은 분들이 올려놓으신 질문들을 보면서 하루하루 궁금증을 풀어가고 있는 학생입니다.
윈도우 베이스 프로젝트를 시작하다보니 뷰의 수가 많아졌는데요.
제가 궁금한점은 터치이벤트를 통해서 어떤 메서드가 호출될 때, 부모뷰에 있는 메서드를 호출하는 방법입니다.
질문이 좀 모호해서 예를 들어서 설명해 드리겠습니다.
ParentsViewController와 거기에 종속(?)되어 있는 QuartzDrawView가 있습니다.
QuartzDrawView는 현재 이미지를 가져와서 그 위에 간단한 편집을 할 수 있도록 하나의 레이어를 더 쌓아놓은 형태인데요.
Touches 이벤트를 통해서 tabCount =2 라는 조건 즉, 더블클릭이 나타났을 때 현재는 같은 QuartzDrawView.m에 존재하는
메서드를 호출하여 편집된 이미지를 모두 지워주고 있는데요. 제가 하고 싶은것은 ParentsViewController.m 에 존재하는
메서드를 호출하는 것 입니다.
헤더에 모두 선언 해주고 Synthesize까지 모두 잡아놓은 상태에서 [ParentsViewController clearDrawLines];
라는 명령을 사용했는데 디버깅 결과 이동을 하지 않는다는 사실을 알았습니다.
이런 상황에서 여러분들은 어떻게 해결을 하시겠는지? 어떻게 해결 하셨는지 도무지 생각이 나질 않아서 글을 올려봅니다.
많은 조언 미리 감사드립니다 ^^ 즐거운 금요일 보내세요~~
윈도우 베이스 프로젝트를 시작하다보니 뷰의 수가 많아졌는데요.
제가 궁금한점은 터치이벤트를 통해서 어떤 메서드가 호출될 때, 부모뷰에 있는 메서드를 호출하는 방법입니다.
질문이 좀 모호해서 예를 들어서 설명해 드리겠습니다.
ParentsViewController와 거기에 종속(?)되어 있는 QuartzDrawView가 있습니다.
QuartzDrawView는 현재 이미지를 가져와서 그 위에 간단한 편집을 할 수 있도록 하나의 레이어를 더 쌓아놓은 형태인데요.
Touches 이벤트를 통해서 tabCount =2 라는 조건 즉, 더블클릭이 나타났을 때 현재는 같은 QuartzDrawView.m에 존재하는
메서드를 호출하여 편집된 이미지를 모두 지워주고 있는데요. 제가 하고 싶은것은 ParentsViewController.m 에 존재하는
메서드를 호출하는 것 입니다.
헤더에 모두 선언 해주고 Synthesize까지 모두 잡아놓은 상태에서 [ParentsViewController clearDrawLines];
라는 명령을 사용했는데 디버깅 결과 이동을 하지 않는다는 사실을 알았습니다.
이런 상황에서 여러분들은 어떻게 해결을 하시겠는지? 어떻게 해결 하셨는지 도무지 생각이 나질 않아서 글을 올려봅니다.
많은 조언 미리 감사드립니다 ^^ 즐거운 금요일 보내세요~~
2010.03.05 15:16:37
질문을 잘 이해하지 못해서 답변을 망설였습니다만, 답을 찾으셨다고 하니 다행이네요.
보통 View Controller A 에서 View Controller B를, modal로든 navigation view controller를 통해서 push를 했든, 화면상에 보여준 상태에서, View Controller B에서 모든 작업이 끝났을 때 화면에서 사라지게 하는것은 View Controller A의 역할 입니다.
즉, 이럴 때 View Controller A에 구현된, View Controller B를 위한, delegate method를 호출 해서 dismiss 혹은 pop을 통해서 View Controller B가 사라지게 합니다. 이게 권장되는 관례인데, 사실상 정석에 가깝습니다.
왜냐하면 View Controller A 입장에서는 View Controller B에 대해서 잘 알고, 필요 했기 때문에 사용한 것인 반면에, View Controller B 입장에서는 View Controller A를 잘 알아야 할 이유가 없습니다. 나중에 View Controller C 와 같은 '누군지 모르는 녀석'에 의해서 다시 사용될 수 있기 때문입니다. 이럴 때 delegate를 사용하면 '넌 누군지 모르겠지만 내가 필요한 몇가지 심부름을 좀 해줘야 겠어'와 같은 상황을 구현할 수 있기 때문이죠.
결론은 지금 찾으신 방법이 정답이라는 말씀입니다. ^^
보통 View Controller A 에서 View Controller B를, modal로든 navigation view controller를 통해서 push를 했든, 화면상에 보여준 상태에서, View Controller B에서 모든 작업이 끝났을 때 화면에서 사라지게 하는것은 View Controller A의 역할 입니다.
즉, 이럴 때 View Controller A에 구현된, View Controller B를 위한, delegate method를 호출 해서 dismiss 혹은 pop을 통해서 View Controller B가 사라지게 합니다. 이게 권장되는 관례인데, 사실상 정석에 가깝습니다.
왜냐하면 View Controller A 입장에서는 View Controller B에 대해서 잘 알고, 필요 했기 때문에 사용한 것인 반면에, View Controller B 입장에서는 View Controller A를 잘 알아야 할 이유가 없습니다. 나중에 View Controller C 와 같은 '누군지 모르는 녀석'에 의해서 다시 사용될 수 있기 때문입니다. 이럴 때 delegate를 사용하면 '넌 누군지 모르겠지만 내가 필요한 몇가지 심부름을 좀 해줘야 겠어'와 같은 상황을 구현할 수 있기 때문이죠.
결론은 지금 찾으신 방법이 정답이라는 말씀입니다. ^^

결국 위임자의 힘을 빌렸습니다. delegate를 호출하여 ParentsViewController에 있는 메서드를 호출하는
방법으로 해결했습니다. 그러나 도큐멘트를 확인한 결과 분명 컨트롤러에서 이벤트를 인식하여 바로 처리할 수 있는
방법이 있다고 여겨집니다. 방법을 확인하는대로 공개하겠습니다 ^^ 즐거운 주말들 보내세요.