2009-05-05 13 views
1

私は簡単なタブバーのiPhoneアプリケーションを作っています。 2つのタブがあり、1つはUIWebViewで、もう1つは設定を保持するテキストフィールドと設定を保存するボタンがあります。iPhoneアプリケーション - ビューは別のビューのメソッドをどのように呼び出すことができますか?

私がしたいのは、ユーザーが設定タブ/ビューで[保存]をクリックしたときにUIWebViewをリロードすることです。私はすでに設定を保存しているので、UIWebView自体を更新する呼び出しを行う方法を理解する必要があります。

ビューからメッセージを別のビューに送信する方法が混乱しています。

答えて

4

私がしたことは、彼らがAppDelegateを介してお互いに話すことです。例えば

View1をが行う機能を持っています:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [appDelegate myFunction]; 

MyAppDelegateは何かを、またはお電話するかのMyFunctionと呼ばれる機能があります。

[viewController myViewFunction]; 

私は」複数のビューをロードするためのかなり良いシステムをセットアップしました(そして、画面が異なっているかのように前後にナビゲートします)。私はちょうどこれを書いてpushplay.netに投稿する時間を作っていない - しかし、私は日の次のカップルでそうしようよ...

===

EDIT:さて、私は私が持っているものを投稿しました。どんなコメントも感謝します。

http://pushplay.net/blog_detail.php?id=27

私は以下のコメンターが言っているのか理解が、私はお互いの間を移動する必要が複数viewcontrollersを有することに基づいて、シームレスに動作例を見ていません。

+0

おかげで、理にかなっています。あなたの投稿が詳細に表示されたら、ここに投稿してください。 – Greg

+0

他のビューにメッセージをプロキシするには、アプリケーションデリゲートを使用する必要はありません。それがビューコントローラの目的です。 –

+0

これは正しい_kind_コードですが、Nathan氏のようにviewControllerで行うべきです。必要以上にappDelegateを追加しないでください。それは、自分が所有する必要があるものだけで十分に大きくなります。 –

5

UITabBarControllerのフレームワーク内でこれらの2つのビューを使用しているという事実は、問題の中核とは無関係です。つまり、アプリケーションの一部に他の部分で何かが発生したことを伝えたいということです。これを行うための一般的な方法はKVOを持つ、またはそのようNSNotificationCenterを使用することです:

// Register interest in finding out when the settings are changed 
[[NSNotificationCenter defaultCenter] addObserver:myWebViewController 
    selector:@selector(refreshWebView:) name:@"settingsSaved" object:nil]; 

// Notify interested parties that the settings have changed 
[[NSNotificationCenter defaultCenter] postNotificationName:@"settingsSaved" object:nil]; 
+0

KVOとNotificationsがこの問題の過剰な音のように聞こえる –

1

これは、特定のアプリケーションと、そのアプリケーションのオブジェクトモデルの複雑さによって異なります。

  • の場合ビューは関連しており、メッセージはビューにのみ関連し、次に互いにメッセージを直接送ることができます。たとえば、ビューは直接サブビューにメッセージを送信することができます(また、送信する必要があります)。親ビューに直接メッセージを送信できます。

  • ビューが関連していないが、同じ情報に関するデータを表示する場合は、viewControllerを通じてメッセージをプロキシする必要があります。これは、View Controllerがある理由です。

  • 強力なMVCアーキテクチャを備えた複雑なアプリケーションを使用している場合は、モデルオブジェクトを更新し、viewControllerを通じてビューにカスケードすることによって、間接的に通信を行う必要があります。あなたはおそらく、あなたのアプリケーションのデリゲートは、アプリケーションの起動時に、あなたの他のビューコントローラのデリゲートなどのWebビューを保持しているコントローラを割り当てた方がいいでしょう。この場合

1

- それはきれいにするためにプロトコルを使用してに見えますが、シンプルなものの場合は、デリゲートタイプをビューコントローラを保持するWebビューとして宣言するだけで済みます。

通知は素晴らしいアイデアであり、小さすぎるタスクはありませんが、deallocなどの通知の登録を解除することが重要であることに注意してください。本当に問題ではないタブバービューコントローラーのトップレベル用です。

0

Webビューを指すタブビューコントローラでは、いつでもインスタンス変数を設定できます。単にIBOutletとして設定し、Interface Builderでそれを接続し、インスタンス変数でメソッドを呼び出します。

.hファイル:

IBOutlet UIWebView *webView; 

@property (nonatomic, retain) UIWebView *webView; 

.mファイル:

@synthesize webView; 

//Then later in your method 
[webView refresh]; //or however you do it 

よろしく、

カイル

関連する問題