2010-07-25 3 views
0

У меня есть функция в UpdateViewController, которая вызывается делегатом MyDownloadController, который закрывает модальный вид (который является UpdateViewController).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

Apple, документация говорит:

dismissModalViewControllerAnimated:

увольняет модальный контроллер представления, который был представлен приемником.

Среднее значение вы вызываете метод rejectModalViewControllerAnimated: на viewController, который представил ModalViewController, который вы хотите уволить. в вашем случае это правильный код для использования.

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

    [self.parentViewController dismissModalViewControllerAnimated:YES]; 
} 

Также ответьте на другие вопросы о количестве делегатов и указателей. Лучший дизайн обычно означает, что у вас нет огромных строк объектов-делегатов, но нет оснований говорить, что это неправильно, это просто беспорядочно ИМХО. Указатели и такие, которые вы описали, скорее всего, вызовет утечки или сбои, причина, по которой он не будет закрыт, - это то, что я указал выше, вы не вызывали метод в соответствующий приемник.

+0

Если вы пытаетесь абстрагироваться от разных частей, то чем лучше это делать, чем делегатов? И использование self.parentViewController не работает. Любые другие идеи? – RyanJM

+0

Извините за крайне поздний ответ, но, надеюсь, это поможет кому-то в конце. В любом случае, спасибо за то, что я правильно ответил на мой ответ. Есть разные способы отбросить это конкретное поведение, но я бы рекомендовал против этого. Предпочтительным способом является делегирование, потому что существует прямая ссылка. Второй предпочтительный путь - через цепочку ответчиков. Контроллер вида view - это следующий ответчик. См. [UIApp sendAction: @selector (myEvent :) для: ноль от: self forEvent: [UIEvent new]]; Контроллер вида, который прослушивает myEvent: в цепочке может ответить. См. Документы: http://bit.ly/10bBa4W – gauravk92

2

Если downloadController - это мнение, которое вы хотите отклонить, я считаю, что вы слишком рано его выпускаете.

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

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

Извините, я должен был назвать контроллеры, чтобы быть более четкими в том, что происходит. Я уточню вопрос, чтобы прояснить это. – RyanJM

Смежные вопросы