2012-08-27 11 views
5

これは私が自分でやろうとしている私の最初のアプリですが、いくつか質問があります。私は4つのタブを持って、最初の "HomeView"というJSONデータを解析しています(これはこれまでに行われています)。iOSのタブ間でデータを渡す

しかし、私が望むのは、解析されているデータのいくつかが他のタブに表示されていることです(また、再度解析する必要はありません)。

#import "HomeView.h" 

@interface HomeView() 
@end 

@implementation HomeView 


//other code 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
//data fetched 
parsed_date=[res objectForKey:@"date"]; 
NSLog(@"Date:%@",parsed_date); 
[UIAppDelegate.myArray addObject:parsed_date]; 
     } 

と私は正しくプリントアウトされている「parsed_date」を見ることができます:HomeViewの私のコードの一部だから、

はこちらです。

だから、このparsed_dateをOtherViewに表示します。

これは私のコードですが、印刷できません。

OtherView.m

#import "OtherView.h" 
#import "HomeView.h" 
#import "AppDelegate.h" 

@interface OtherView() 

@end 

@implementation OtherView 
@synthesize tracks_date; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    //preview value of other class 
    tracks_date = [UIAppDelegate.myArray objectAtIndex:0]; 
NSLog(@"Dated previed in OtherView: %@", tracks_date); 
} 

及び(ヌル)がプリントアウトされます。

だから、あなたが私のsollutionを提案することができ

#import <UIKit/UIKit.h> 

#define UIAppDelegate ((AppDelegate *)[UIApplication sharedApplication].delegate) 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 
@property (nonatomic, strong) NSArray *myArray; 

@end 

delegate.hアプリのコードを追加しましたか?

答えて

11

代わりにアプリケーション代理人にプロパティを追加してください。これが最善ではないかもしれないが

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSString *valueInTab = delegate.myProperty; 
+0

のmyPropertyは、自分の@propertyの名前かどうかですか?私はAppDelegate.mファイルにこのコードを置くべきですか? – ghostrider

+0

myPropertyは@propertyの名前です。名前は任意に指定できます。あなたが作成したコードスニペットをビューコントローラに配置する必要があります。 – scord

+0

@property(nonatomic、retain)NSString * myPropertyは、アプリケーションデリゲートの.hファイルに入ります – scord

1

プロパティを割り当てるような何かを:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

delegate.myProperty = @"My Value"; 

そして、あなたの別のタブで、あなたは同じように、このプロパティを取得することができますこれを行う方法は、簡単で効果的です。

データをアプリケーションデリゲートに保存し、そこから取得します。あなたは、アプリケーションデリゲート共有アプリケーションへのショートカットを作成することができます。次に、そこにある値にアクセスします。私が言ったように

AppDelegate.h 

#define UIAppDelegate ((AppDelegate *)[UIApplication sharedApplication].delegate) 

@property (nonatomic, strong) NSArray *myArray; 

TabView1.m 

#import "AppDelegate.h" 

SomeObject *myObject = [UIAppDelegate.myArray objectAtIndex:0]; 

、それはあなたのアプリケーションのためのデータを整理するための最良の方法ではないかもしれない、この方法は、アプリケーションレベルで共有される必要がある少量のデータのための作業を行います。お役に立てれば。

+0

ハ!多分、私が思ったよりも普及した方法かもしれません。 ;) –

+0

私はあなたが言ったことを言いますが、私はまだnullを取得します。あなたは私の編集を見ることができますか? – ghostrider

2

最後のコードセグメントにHomeViewを作成すると、クラスの新しいインスタンスが作成されます。そのメソッドがで実行されない限り、そのクラスのインスタンスからconnectionDidFinishLoadingからのデータは含まれません。

基本的には、「シングルトン」の行に沿ったAppDelegateまたは静的ストレージのいずれかを実行するために、何らかの永続性メカニズムを使用する必要があります。

+1

ところで、これはObject-Oriented 101なので、Objective-Cでプログラミングを始める前に学んだはずです。 –

+4

あなたの答えは正しいが、追加されたコメントは本当に必要ではない。 –

1

これは、自分でHomeViewのインスタンスを作成するために発生します。 これは何も接続していません。
あなたの最初の例は、あなたのペン先から作成され、初期化されているため動作します。

私はIBOutletを使用し、InterfaceBuilderの両方の「ビュー」を接続することをお勧めします。 InterfaceBuilderで

@interface OtherView() 
    IBOutlet HomeView *homeView; 
@end 

@implementation OtherView 
@synthesize tracks_date; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"Dated previed in OtherView: %@", homeView.parsed_date); 
} 

- (void)dealloc: 
{ 
    [homeView release]; 
} 

、あなたのオブジェクトを管理し、一緒に(...、IBOutletsとIBActionを経由して)それらを接続することができます。

私はthis videoがこのコンセプトがどのように機能するかを示す良いデモです。

+0

私はまだ(null)を取得します。これらのビューをInterface Builderでどのように接続するのですか?リンクでは、ラベルやボタンについては言いましたが、全体像については言いませんでした。 – ghostrider

+0

あなたはどこで他のビューへのアドレス可能性を得ますか? –

+1

これはタブコントローラーによって行われます。最初のタブはHomeViewで、OtherViewは私の2番目のタブなので、直接接続されていません(これが意味するものならば) – ghostrider

関連する問題