2つのコントローラーでModalViewControllerを同じように使用するにはどうすればよいですか?
-
27-09-2019 - |
質問
私は使用しています 320 TTMessageController
私のアプリで。私はそれをどのように使用するかを考え出し、他の多くのものを追加します(を含む TTMessageControllerDelegate
方法と ABPeoplePickerNavigationControllerDelegate
方法)。それを理解するのに少し苦労した後、それは私にとって素晴らしいものです。
私が今抱えている問題はデザインの問題です。同じ代表的な方法を含む2つの異なる場所で同じように使用したいと思います。私の現在のアプローチは、すべてのコードをから継承する単一のクラスに入れたことです NSObject
, 、呼ばれます ComposerProxy
, 、そして、私はそれを使用する2つのコントローラーを持っているだけです。
ComposerProxy *proxy = [[ComposerProxy alloc] initWithController:this];
[proxy go];
go
メソッドはを構築します TTMessageController
, 、それを構成し、aに追加します UINavigationController
, 、そしてそれを提示します:
[self.controller presentModalViewController: navController animated: YES];
私はすべてのコードをうまくカプセル化しているので、これはうまく機能します ComposerProxy
そして、私はそれを使用したい場所で上記の2行だけが必要です。
ただし、欠点は、できないということです dealloc
proxy
クラッシュすることなく変数。私はできません autorelease
どちらか:同じ問題。
だから私は私の代理アプローチが貧弱なアプローチであるかどうか疑問に思っています。それを使用するクラスで多くの重複コードを必要とせずに、このような動作の束を通常どのようにカプセル化しますか?デリゲートクラスを自分に追加する必要がありますか ComposerProxy
コントローラーに仮説でモーダルビューコントローラーを却下する責任を負わせる composerDidFinish
方法またはそのようなもの?
多くのティア!
解決
上記のことから、クラッシュは必ずしもデザインが不十分であることを示しているわけではありません。メモリ管理の問題でクラッシュしている可能性があります。たぶん、コントローラーが過剰にリリースされている、言うのは難しい - あなたはどのようなクラッシュを得ていますか?
現在のデザインは問題ないようですが、代替手段は カテゴリー uiviewcontrollerで。このカテゴリは、継承を複製または使用することを要求することなく、モーダルTTMessageControllerを提示するために必要なすべてのコードを(カテゴリにインポートするUiviewControllerサブクラスに)追加します。
@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