Как я могу использовать modalViewController одинаково в двух контроллерах? - PullRequest
1 голос
/ 16 апреля 2010

Я использую Три20 TTMessageController в моем приложении. Я понял, как его использовать, добавив кучу других вещей (включая TTMessageControllerDelegate методы и ABPeoplePickerNavigationControllerDelegate методы). Это прекрасно работает для меня, после небольшой попытки понять это.

Проблема, с которой я столкнулся сейчас, - это проблема разработки: я хочу использовать ее одинаково в двух разных местах, в том числе с одними и теми же методами делегирования. Мой текущий подход заключается в том, что я поместил весь код в один класс, наследуемый от NSObject, называемый ComposerProxy, и у меня просто есть два контроллера, использующих его, использующих прокси, например:

ComposerProxy *proxy = [[ComposerProxy alloc] initWithController:this];
[proxy go];

Метод go создает TTMessageController, настраивает его, добавляет к UINavigationController и представляет:

[self.controller presentModalViewController: navController animated: YES];

Это прекрасно работает, так как мой код красиво инкапсулирован в ComposerProxy, и мне нужны только две вышеупомянутые строки везде, где я хочу его использовать.

Недостатком является то, что я не могу dealloc переменную proxy без сбоев. Я тоже не могу autorelease: та же проблема.

Так что мне интересно, если мой прокси-подход плохой. Как обычно инкапсулировать такие поведения, не требуя большого количества дублирующегося кода в классах, которые его используют? Нужно ли добавить класс делегата к моему ComposerProxy и назначить контроллер ответственным за отклонение контроллера модального представления гипотетическим composerDidFinish методом или чем-то подобным?

Много ТИА!

1 Ответ

1 голос
/ 16 апреля 2010

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

Несмотря на то, что текущий дизайн выглядит нормально, альтернативой может быть создание категории в UIViewController. Категория добавит (к подклассам UIViewController, которые импортируют категорию) весь код, необходимый для представления модального TTMessageController, не требуя дублирования или использования наследования.

@interface UIViewController ( Composer )
// categories can't add instance vars, so return the new controller if you need to store it...
- (TTMessageController *)presentMessageController;
@end

@implementation UIViewController ( Composer )
- (TTMessageController *)presentMessageController {
    // contents of ComposerProxy#go except referring to 'self' instead of 'self.controller'
}
@end
...