2010-12-20 3 views
1

基本的には、画面の下部にあるタブバーを使って4つのビューが切り替わります。私はそれぞれのために設定されたビューコントローラを持っていて、それらはすべて正常に動作します。唯一の問題は、さまざまなビュー間で情報を共有する方法がわからないことです。たとえば、UISegmentedControlの出力を受け取り、選択範囲を整数(1,2,3,4) 。問題は、最初のビューコントローラ(実際にはその情報を持つもの)からその整数にアクセスする方法がわかりません。私はこれが非常に基本的な問題だと確信していますが、私のgoogle-fuはここで働いていないようです。ありがとう!非常に基本的な目的-c質問 - さまざまな意見を情報共有するにはどうすればよいですか?

+0

誰も知らない。それは複雑すぎるし、常に変化し続ける!:) – Fattie

答えて

5

MVCメソッドを使用すると、情報をビューコントローラに格納しないでください。情報を格納する別個のオブジェクトが必要です。ビュー・コントローラはそれをロードし、ビューはそれを表示します。これを行う最も簡単な方法は、アプリケーションのデリゲートに情報を格納することです。次に、ビューコントローラが情報を検索/変更する必要があるときは、[[UIApplication sharedApplication] delegate]を使用してデリゲートを取得し、必要に応じて情報をロード/変更することができます。情報をロードして、viewDidLoadまたはviewWillDisplay:の表示を更新し、アクションメソッドで変更します。

編集例:

DelegateClass.h

@interface DelegateClass : NSObject { 
    //ivars 
    float number1; 
} 
@property (assign) float number1; 
... 
@end 

DelegateClass.m

#import "DelegateClass.h" 
@implementation DelegateClass 
@synthesize number1; 
... 
@end 

MyViewController.m

#import "DelegateClass.h" 
@implementation MyViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    DelegateClass *delegate = [[UIApplication sharedApplication] delegate]; 
    float number1 = delegate.number1; 
    ... 
} 
- (IBAction)actionMethod:(id)sender { 
    float number1 = sender.floatValue;//get new value 
    ((DelegateClass*)[[UIApplication sharedApplication] delegate]).number1 = number1; 
} 
... 
@end 
+0

大丈夫、これは私を一番遠くに持ってきました...もう一度、私はこれで本当の初心者です、どうすればこれから価値を得ることができますか?私は、アプリケーションデリゲート、 - (void)function1;に関数を追加し、[[[UIApplication sharedApplication] delegate] function1]のような別の場所でそれを実行するとOKをコンパイルしますが、 "function1 'プロトコルに見つかりませんでした "、私はまだアプリケーションの代理人の変数を取得または設定する方法がわかりません。私は "number1"と呼ばれる浮動小数点を持っているとしましょう、どのようにnumber1 = 1.0を行うことができますか?またはnumber2 = number1;アプリケーションの代理人の外に? – wyager

+0

エラーを取り除くには、デリゲートのヘッダーファイルをインクルードし、delegateの結果をそのクラスにキャストします。デリゲートにプロパティを取得/設定する例を追加します。 – ughoavgfhw

+0

OK、もう少しですが、今は "警告:type 'id 'が 'UITabBarControllerDelegate'プロトコルに準拠していないというエラーが表示されます。 – wyager

0

あなたの意見は、変数をUITabBarControllerに公開することができます。 UITabBarControllerには、これらのビューがこれらの変数を参照するために呼び出すことができるメソッドがあります。

または、UITabBarControllerに変数の値を直接設定することもできます。推奨しません(入力はかなり少なくて済みます)

Googleでbtwという名前のクイック検索を実行して、これを見つけたのはAccessing parent view controller (custom) propertiesです。そこにサンプルコードがあるように見えます。 :)

これが役に立ちます。

+0

OK、私はこれを尋ねるのは本当に愚かだと思いますが、UITabBarControllerにはプログラムでアクセスするにはどうすればいいですか?(アプリケーションデリゲートのコードだけでなく、すべてのビューが、UITabBarController自体のコードはありません)私はそれのためのクラスを作成し、インターフェイスビルダーで、クラスを "UITabBarController"から私のカスタムクラスに変更しますか?それが私がこれらの意見をコントロールしてきた理由です。 – wyager

+0

また、同じように愚かな質問、私は私の意見のインスタンスとは何ですか?私がしているのは、それらのコードを書くことだけですが、明示的に宣言したり、名前を付けたりすることはありません。それは自動的に起こるように見えるので、私は変数の値を見つけるときに何を使うべきか分かりません。私はそれが "newvalue = ???? ???? selectorValue"のように見えるだろうと知っていますが、私は何が分かりませんか?ビューから値にアクセスするとき、またはビューがUITabBarControllerからの変数にアクセスしているときのいずれかです。 – wyager

+0

私は下のuser387184でコードを調べることをお勧めします。彼は、グローバルにアクセス可能なデータを格納するためにアプリケーションデリゲートを使用しています。しかし、その欠点の1つは、コードが移植性がないということです(前にこの道を歩いてしまった)。 – donkim

0

私はすべての主要なクラスで実際にアクセスする必要がある特定のデータがある私のすべてのアプリケーションで一般的なテーマを使用します。私はそれが本当に使いやすく、事実上エラーフリーであることがわかります。 (ここで再びスーパーのアイデアのためのフォーラム内のすべての人々に感謝!)

私は私からそれを得る。このコードでは

@class WebiDataManager; 

    @interface FirstViewController : UIViewController<MFMessageComposeViewControllerDelegate, SetupDelegate> { 
     WebiDataManager   *webiDataManager; 
    ... 

...私はそれを必要とするすべてのクラスでは、この変数を宣言このグローバル変数を介して、私は常にすべての主要coredataへのアクセス権を持っているので、AppDelegate ...ところで

#import "WebiAppDelegate.h" 

- (void)viewWillAppear:(BOOL)animated { 
     // D_IN; 
     [super viewWillAppear:animated]; 


     //get the dataManager global Object, so we always have a structured accesss to the data! 
     WebiAppDelegate *mainDelegate = (WebiAppDelegate *)[[UIApplication sharedApplication]delegate]; 
     self.webiDataManager = mainDelegate.webiDataManager; 

が、これはまた、coredataのために素晴らしい作品。

私はそれを明らかに十分に説明できました...