2010-07-25 2 views
0

저는 UpdateViewController에서 모달 뷰 (UpdateViewController)를 닫을 대리자 MyDownloadController에 의해 호출되는 함수를 가지고 있습니다.iPhone : modalview가 닫히지 않습니다.

-(void)errorDownloading { 
    self.downloadController.delegate = nil; 
    [downloadController release]; 

    [self dismissModalViewControllerAnimated:YES]; 
} 

위임 포인터를 사용하지 않고이 작업을 시도했지만 여전히보기를 닫지 않습니다.

대리자 MyDownloadController 내의 이와 같은 방법 호출

-(void)connectionError { 
    if([delegate respondsToSelector:@selector(errorDownloading)]){ 
     [delegate errorDownloading]; 
    } 
} 

및이 기능은 다른 대표 (MyConnectionController)에 의해 호출된다.

많은 대표자가있는 데 문제가 있습니까? 그리고 포인터 오류 또는 뭔가 그들과 함께 닫을 수있는 모달보기 효과가 될까요? 그렇다면 어떻게/왜?

UpdateViewController (the actual modal view I am trying to close) 
|- MyDownloadController (the controller that abstracts the process being done) 
    |- MyConnectionController (a helper class I wrote to interact with NSURLConnection) 
     |- NSURLConnection 

이 문제를 진단하는 가장 좋은 방법은 무엇입니까 :

나는 대표단이 구조를 가지고?

답변

0

애플 문서는 말한다 :

dismissModalViewControllerAnimated :

는 수신기에 의해 발표되었다 모달 뷰 컨트롤러를 일축.

당신은 해고하고 싶은 ModalViewController를 제시 한 viewController에서 dismissModalViewControllerAnimated : 메소드를 호출합니다. 귀하의 경우, 이것이 올바른 코드입니다.

-(void)errorDownloading { 
    self.downloadController.delegate = nil; 
    [downloadController release]; 

    [self.parentViewController dismissModalViewControllerAnimated:YES]; 
} 

대리인 수와 포인터 수에 대한 다른 질문에 대한 답변을 제공합니다. 더 나은 디자인은 대개 델리게이트 객체의 거대한 문자열을 가지고 있지 않다는 것을 의미합니다. 그러나 잘못한 이유는 거의 없습니다. 단지 지저분한 IMHO가됩니다. 당신이 설명한 포인터는 누설이나 충돌을 일으킬 가능성이 높습니다. 내가 닫지 않을 이유는 위에서 지정한 것입니다. 메서드를 적절한 수신기에 호출하지 않았기 때문입니다.

+0

다양한 부분을 추상화하려는 경우 델리게이트 이외의 다른 방법으로 더 좋은 방법은 무엇입니까? 그리고 self.parentViewController를 사용하는 것이 작동하지 않습니다. 다른 아이디어? – RyanJM

+0

매우 늦게 회신을 드려서 죄송 합니다만, 결국에는 도움이되기를 바랍니다. 어쨌든 정확한 답변으로 표시해 주셔서 감사합니다. 이 특정 동작을 추상화하는 여러 가지 방법이 있지만 반대하는 것이 좋습니다. 선호되는 방법은 직접적인 참조가 있기 때문에 위임입니다. 두 번째로 선호되는 방법은 리스폰 더 체인을 이용하는 것입니다. 뷰의 뷰 컨트롤러는 다음 응답자입니다. [UIApp sendAction : @selector (myEvent :) to : nil from : self forEvent : [UIEvent new]]를 참조하십시오. 체인에서 myEvent :를 수신하는보기 컨트롤러가 응답 할 수 있습니다. docs : http://bit.ly/10bBa4W를 참조하십시오. – gauravk92

2

downloadController가 해제하려는보기 인 경우 너무 빨리 릴리스한다고 생각합니다.

-(void)errorDownloading { 
    [self dismissModalViewControllerAnimated:YES]; 

    self.downloadController.delegate = nil; 
    [downloadController release]; 
} 
+0

죄송합니다. 컨트롤러의 이름이 무엇이 었는지보다 명확하게해야합니다. 나는 이것을 명확히하기 위해 질문을 갱신 할 것이다. – RyanJM