基本的には、画面の下部にあるタブバーを使って4つのビューが切り替わります。私はそれぞれのために設定されたビューコントローラを持っていて、それらはすべて正常に動作します。唯一の問題は、さまざまなビュー間で情報を共有する方法がわからないことです。たとえば、UISegmentedControlの出力を受け取り、選択範囲を整数(1,2,3,4) 。問題は、最初のビューコントローラ(実際にはその情報を持つもの)からその整数にアクセスする方法がわかりません。私はこれが非常に基本的な問題だと確信していますが、私のgoogle-fuはここで働いていないようです。ありがとう!非常に基本的な目的-c質問 - さまざまな意見を情報共有するにはどうすればよいですか?
答えて
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
大丈夫、これは私を一番遠くに持ってきました...もう一度、私はこれで本当の初心者です、どうすればこれから価値を得ることができますか?私は、アプリケーションデリゲート、 - (void)function1;に関数を追加し、[[[UIApplication sharedApplication] delegate] function1]のような別の場所でそれを実行するとOKをコンパイルしますが、 "function1 'プロトコルに見つかりませんでした "、私はまだアプリケーションの代理人の変数を取得または設定する方法がわかりません。私は "number1"と呼ばれる浮動小数点を持っているとしましょう、どのようにnumber1 = 1.0を行うことができますか?またはnumber2 = number1;アプリケーションの代理人の外に? – wyager
エラーを取り除くには、デリゲートのヘッダーファイルをインクルードし、delegate
の結果をそのクラスにキャストします。デリゲートにプロパティを取得/設定する例を追加します。 –
ughoavgfhw
OK、もう少しですが、今は "警告:type 'id
あなたの意見は、変数をUITabBarController
に公開することができます。 UITabBarController
には、これらのビューがこれらの変数を参照するために呼び出すことができるメソッドがあります。
または、UITabBarController
に変数の値を直接設定することもできます。推奨しません(入力はかなり少なくて済みます)
Googleでbtwという名前のクイック検索を実行して、これを見つけたのはAccessing parent view controller (custom) propertiesです。そこにサンプルコードがあるように見えます。 :)
これが役に立ちます。
OK、私はこれを尋ねるのは本当に愚かだと思いますが、UITabBarControllerにはプログラムでアクセスするにはどうすればいいですか?(アプリケーションデリゲートのコードだけでなく、すべてのビューが、UITabBarController自体のコードはありません)私はそれのためのクラスを作成し、インターフェイスビルダーで、クラスを "UITabBarController"から私のカスタムクラスに変更しますか?それが私がこれらの意見をコントロールしてきた理由です。 – wyager
また、同じように愚かな質問、私は私の意見のインスタンスとは何ですか?私がしているのは、それらのコードを書くことだけですが、明示的に宣言したり、名前を付けたりすることはありません。それは自動的に起こるように見えるので、私は変数の値を見つけるときに何を使うべきか分かりません。私はそれが "newvalue = ???? ???? selectorValue"のように見えるだろうと知っていますが、私は何が分かりませんか?ビューから値にアクセスするとき、またはビューがUITabBarControllerからの変数にアクセスしているときのいずれかです。 – wyager
私は下のuser387184でコードを調べることをお勧めします。彼は、グローバルにアクセス可能なデータを格納するためにアプリケーションデリゲートを使用しています。しかし、その欠点の1つは、コードが移植性がないということです(前にこの道を歩いてしまった)。 – donkim
私はすべての主要なクラスで実際にアクセスする必要がある特定のデータがある私のすべてのアプリケーションで一般的なテーマを使用します。私はそれが本当に使いやすく、事実上エラーフリーであることがわかります。 (ここで再びスーパーのアイデアのためのフォーラム内のすべての人々に感謝!)
私は私からそれを得る。このコードでは
@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のために素晴らしい作品。
私はそれを明らかに十分に説明できました...
誰も知らない。それは複雑すぎるし、常に変化し続ける!:) – Fattie