UIViewControllers спотыкаясь друг на друга - PullRequest
0 голосов
/ 25 марта 2010

Нужен лучший совет здесь ...

Приложение на основе навигации. Корневое представление - это UITableView, где пользователь может детализировать UIViewController (назовите его VC1). Пользователь хочет инициировать какую-то задачу, но может потребовать дополнительную информацию, прежде чем она сможет продолжить. Если это так, то VC1 выделяет и представляет модальный VC2, используя «перевернутый» переход, содержащий сильную ссылку на VC2 в свойстве.

Все довольно стандартно. Вот где у меня проблемы. Как только пользователь заполняет необходимую информацию в VC2, приложение может перейти к MFMailComposeViewController или вернуться к VC1. Если они продолжают работать с MailCompose, то после этого он должен вернуться к VC1.

VC2 имеет слабую ссылку на VC1, и проблема возникает, когда VC2 пытается отклониться и представить MFMailComposeViewController:

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

Я получаю EXC_BAD_ACCESS на VC1, потому что, очевидно, моя слабая ссылка на VC1 уже отменена, хотя VC1 имеет сильную ссылку на VC2!?!

Так что мой вопрос ... как с этим обращаться? Будет ли модель делегата лучше? Как это будет вызвано?

Примечание: VC1 довольно большой, и VC2 часто не требуется, поэтому я стараюсь держать VC2 как можно более отделенным от VC1 (включая его собственный NIB).

Ответы [ 2 ]

1 голос
/ 26 марта 2010

VC2 имеет слабую ссылку на VC1, и проблема возникает, когда VC2 пытается распустить себя и представить MFMailComposeViewController:

Имеется круговая зависимость, поскольку VC1 знает о VC2, а затем вы сообщаете VC2 о VC1. И когда у вас есть круговые зависимости, вы получаете все виды проблем.

Вы должны использовать образец делегата здесь. Когда VC1 представляет VC2, он должен сделать себя делегатом VC2. Когда VC2 завершен и хочет отменить себя, он должен позволить делегату позаботиться об этой операции. Другими словами, то, что показывает VC2, должно быть то, что отклоняет VC2. VC2 должен быть реализован таким образом, чтобы он не знал, что его представляло, только то, что он представил, будет отвечать за его отклонение.

Два похожих ответа, которые я дал недавно:

Всплывающее модальное окно с UITableView на iPhone

вызов метода в подклассе UIView

0 голосов
/ 26 марта 2010

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

Вы можете попробовать позвонить:

[self.parentViewController dismissModalViewControllerAnimated:YES]

Или может быть ваш дескриптор метода showMailModalView закрывает текущий контроллер модального представления перед отображением редактора почты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...