0

여기에 모범 사례가 필요합니다 ...UIViewControllers가 서로 위로 넘어 가기

내비게이션 응용 프로그램. 루트 뷰는 UIViewController 세부 정보 (VC1이라고 함)까지 드릴 다운 할 수있는 UITableView입니다. 사용자가 일부 작업을 시작하려고하지만 계속 진행하려면 에 추가 정보가 필요합니다. 그렇다면 VC1 allocs &은 속성에서 VC2에 대한 강력한 참조를 보유하는 "뒤집기"전환을 사용하여 모달 VC2를 제공합니다.

모두 상당히 표준입니다. 여기 내가 곤경에 처한 곳이야. 사용자가 VC2에서 필요한 정보를 채우면 앱은 MFMailComposeViewController으로 계속 이동하거나 VC1로 되돌릴 수 있습니다. MailCompose를 계속 수행하면 종료 될 때 VC1으로 돌아와야합니다.

[self dismissModalViewControllerAnimated:YES]; 
[VC1 performSelector:@selector(showMailModalView) withObject:nil afterDelay:0.2]; 

내가 VC1에 EXC_BAD_ACCESS를 얻을 분명히, VC1 내 약한 참조가 이미하고있다, 때문에 : VC2 자체를 닫 시도와 현재 MFMailComposeViewController

VC2는 VC1에 약한 참조 및 문제 arrises있다 VC1이 VC2에 대한 강력한 참조를 가지고있다하더라도! dealloc'd!

제 질문은 ... 어떻게 처리해야합니까? 대의원 패턴이 더 나아질까요? 그게 어떻게 생겨 났을까요?

참고 : VC1은 VC1 (가능한 자체 NIB 포함)에서 가능한 한 분리 된 상태로 유지하기 위해 VC1이 상당히 크고 VC2가 자주 필요하지 않습니다.

답변

1

VC2는 VC1에 약한 참조 및 문제 arrises 있습니다

VC1 다음 VC2과에 대해 알고 있기 때문에 당신이해야하는 것은, 순환 종속성입니다 VC2가 VC1에 대해 알게했습니다. 그리고 순환 종속성이 있으면 모든 종류의 문제가 발생합니다.

여기에서 대리자 패턴을 사용해야합니다. VC1이 VC2를 제공하면 VC2의 위임을 받아야합니다. VC2가 끝나고 스스로 해고하기를 원할 때, VC2는 그 작업을 처리 할 수 ​​있어야합니다. 즉, VC2를 보여주는 것은 VC2를 없애는 것입니다. VC2는 무엇을 제시했는지 알지 못하도록 구현되어야하며, 제시된 내용은이를 기각 할 책임이있다.

두 비슷한 답변 나는 최근에 준 :

Pop-up modal with UITableView on iPhone

call method in a subclass of UIView

0

동일한 문제가 발생하여이를 수정 한 방법을 기억하려고합니다.

[self.parentViewController dismissModalViewControllerAnimated:YES] 

을 또는 당신은 당신의 showMailModalView 방법 핸들 메일 작곡가를 표시하기 전에 현재 모달 뷰 컨트롤러를 기각을 할 수 :

당신은 전화 시도 할 수 있습니다? VC2 자체와 현재 MFMailComposeViewController를 닫 을 시도 할 때

관련 문제