2011-01-06 12 views
0

私は4つのタブを持つタブバーコントローラを持っています。各タブには、独自のビューコントローラとUIWebViewがあります。別のビューコントローラ内のインスタンスメソッドへのアクセス

私はvc1のボタン(button1)とインスタンスメソッドonClick1を持っているとしましょう。 vc2では、reloadというメソッドがあります。私の質問は、特定のインスタンスメソッド、vc1からvc2のonClick1にアクセスするにはどうすればいいですか?

詳細については、実際にiPhone用の簡単なショッピングユーティリティをコーディングしようとしています。ユーザーがブラウズ・ビューからカートにアイテムを追加すると、カート・ビューを自動的にリロードすることができます。

以下は、私が意味するもののいくつかの例です。この問題は、私が思っていた以上に困難でした。私は自分のアプリケーションや何を再設計するか分からない。おそらく、vc1とvc2の両方がvcmainのサブクラスに属していて、そこにそれぞれの参照がありますか?しかし、もし私がそれをすれば、それらを対応する.xibにどのように参照するのですか?みんなありがとう!

@implementation viewController 1 

//Reloads vc2 
-(IBAction) onClick1: (id) sender { 

//Calls vc2 reload 
[vc2 reload]; 
} 

@end 

@implementation viewController 2 

//Reload View 
-(void)reload { 
    [webView reload]; 
} 

@end 

答えて

0

私はあなたがすでにすべてのあなたのタブバービューコントローラを含むUITabBarController *tabBarControllerを持っているベースUIViewController(のはMyTabBarsそれを呼びましょう)のようなものを持っている必要があります考えています。それがよく知られていると思われる場合はMyTabBarsというメソッドを-(void)reloadCartとします。 reloadCarttabBarController.viewControllersの配列を処理します。各viewControllerrespondsToSelector:@selector(reload)を実行し、特定のviewControllerが条件を満たす場合は、そのセレクタメソッドを呼び出します。

これを行うには、すべてのvc1、vc2、...ファイルにid delegateが定義されて合成されていることをお勧めします。 MyTabBarsが異なるタブバーを作成するときは、vc1とvc2をdelegateからselfに設定します。

@implementation viewController1 

//Reloads vc2 
-(IBAction) onClick1: (id) sender { 

//Calls MyTabBars reloadCart which will look for all tab bar view controllers 
//that have the 'reload' method 
[delegate reloadCart]; 
} 

@end 

このソリューションのアイデアはMyTabBarsは、任意のをトリガするようになります:あなたは今、VC1に次のコードを持つことができ、あなたはVC1とVC2にMyTabBarsのデリゲートを渡す方法を知っていると仮定すると、

@implementation MyTabBars 

//Reload Cart View 
-(void)reloadCart { 
    for (UIViewController *thisUIViewController in tabBarController.viewControllers){ 
    if ([thisUIViewController respondsToSelector:@selector(reload)]) { 
     [thisUIViewController reload]; 
    } 
    } 
} 

@end 

reloadメソッドは、私たちのタブバービューコントローラのいずれかにあります。そのため、vc1、vc2などのファイルにこのようなメソッドの名前を付けることに注意してください。このソリューションは、命名規則に応じて、同じメソッドで一意のvcメソッドまたは複数のvcsをトリガーします。

これが役に立ちます。

1

基本的に3つのアプローチがありますが、それぞれには盛り上がりとマイナスがあります。私はあなたに詳細な概要を伝え、詳細についてはAppleの非常に包括的なドキュメントに行きます。うまくいけば、私はより具体的なヘルプのためのGoogleに適切な条件を与えることができます。

@dredfulかなり詳細な詳細はであり、他のView Controllerへのハンドルを持ち、それらのメソッドを直接呼び出すことはです。それはうまくいきますが、それはあなたのすべてのコントローラへのポインタを混乱させ、扱いにくいものにする可能性があり、必要なコントローラを得るためにビュー階層を横断することは、実際には非常に難しいことです。

第2のアプローチは、キー値観測です。あるView Controllerを登録して、別のView Controllerの特定のキー(名前付きプロパティ)を「監視」し、さまざまなことが発生したときに特定のセレクタを起動することができます。これは魔法のように素晴らしいですが、ある時点で両方のコントローラーへのポインターを同時に持たなければならず、上記の「直接呼び出し」の欠点を完全には解消しません。これはまた、ビューコントロールとデータ、ブレークMVCの種類の不幸なカップリングの一種です。

第3のアプローチは、NSNotificationCenterを使用するです。クラスは通知を送信することができ、その種の通知を受信するために自身を登録する他のオブジェクトは、それが発生したときにトリガーされます。カートにアイテムを追加するたくさんの異なるオブジェクトを持っている可能性があり、通知センターにノートを撃つだけで(オブジェクトや任意のデータを渡しても)、カートビューはこれらの通知を消費することができるので、渡されたオブジェクトをキャッチし、そのことを行います。特に話している人を気にする必要はありません。それはあなたのアプリケーションの別々の部分をうまく切り離した状態に保ちます。欠点は、オーバーヘッドがあり、通知消費クラスが実行するセレクタが同期して実行されるため、ネットワークアクティビティや他の長いプロセスを隠すことができないということです。

関連する問題