1

2つのクラスがあります。AとB.ClassAの中に、JSONデータを取得して配列に追加するメソッドがあります。ClassBからこの配列にアクセスしたい。どうすればそれを達成できますか?

ClassA.h
- (void)viewDidLoad
{
//initialise arrayPlaces and arrayWeather
[super viewDidLoad];

dispatch_async(queue, ^{
NSData* data = [NSData dataWithContentsOfURL: 
                    serverURL];
                    [self performSelectorOnMainThread:@selector(fetchedData:) 
                    withObject:data waitUntilDone:YES];
});
}

- (void)fetchedData:(NSData *)responseData {

//parse out the json data
NSError *error;
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
tempArray = [NSJSONSerialization 
             JSONObjectWithData:responseData //1
             options:kNilOptions 
             error:&error];

//declare arrayPlaces
arrayToPass = [[NSMutableArray alloc] init];

//...codes to add array here using a loop...
[arrayToPass addObject:tempString];
}

ClassBには、ClassAからすべての配列を取得したいtableViewがあります。どうすればこれを達成できますか?

ClassA *cA = [[ClassA alloc]init];
ClassA.view;
arrayReceived = ClassA.arrayToPass;

ClassBに実装すると、上記は機能しないようです。

ClassB *cB = [[ClassB alloc] init];
[cB setArrayReceived:arrayToPass];

コードのこの部分の後にClassAで実装された場合も、これは機能しません。"//...ループを使用してここに配列を追加するコード...[arrayToPassaddObject:tempString];

助けてください!!ありがとう!

4

4 に答える 4

2

コードが機能しない理由fetchData:は、非同期で実行されarrayToPass、コードの実行時にまだ入力されていないためですarrayReceived = ClassA.arrayToPass;

ですから、それClassBについて知らせなければなりません。最初にとClassADelegateの間のプロトコルを宣言し、次のようなタイプのプロパティを宣言するのはどうですか。ClassAClassBClassAClassADelegate

in ClassA.h
@protocol ClassADelegate ;//Forward declaration of the protocol
@interface ClassA {...
}
@property (nonatomic, assign) id <ClassADelegate> delegate;
@end

@protocol ClassADelegate <NSObject> 
-(void) classADidReceiveData:(NSArray *)array;
@end

次にClassB、これの代理人を作成します

@interface ClassB : <ClassADelegate> { ...

classADidReceiveData:そしてもちろん、ClassBでメソッドを実装します。

-(void)classADidReceiveData:(NSArray*) array{
 arrayReceived = array;
}

次に、fetchData:次のように変更します。

- (void)fetchedData:(NSData *)responseData {

...
//...codes to add array here using a loop...
[arrayToPass addObject:tempString];

 //Call the delegate method if a delegate has been set
if(delegate){
     [delegate classADidReceiveData:arrayToPass]
}
}

ClassAデータを受信したときに、そのことにClassB気付くことができるようにします。

全体的な使用法は次のとおりです。

ClassA *cA = [[ClassA alloc]init];
cA.delegate = self;
cA.view;

でデータをフェッチした後に実行する必要がある場合はClassB、で実行classADidReceiveDataClassBます。

-(void)classADidReceiveData:(NSArray *)array{
 arrayReceived = array;
 //Do whatever you want after receiving array
}
于 2012-04-09T00:15:08.027 に答える
0

クラスAの配列をクラスAの配列として作成するpropertyと、クラスBで簡単にアクセスできます。

in Class A.h

@property (strong, nonatomic) NSMutableArray *tempArray;

in Class A.m

@synthesize tempArray;

tempArray次に、クラスBのクラスAのインスタンスを取得すると、次のようにアクセスできます。class_a_object.tempArray

于 2012-04-05T11:07:42.877 に答える
0

まず、クラスAの配列をメンバー変数として宣言する必要があります。また、クラスAには、それを返すメソッドが必要です(@propertyの場合は@synthesizeを使用できます)。

今、あなたには選択肢があります。クラスBは、メンバーとしてAインスタンスを持つことができます。その場合、クラスBはAに配列(ポインター)を要求するだけです。クラスBは、配列をAとBの両方に渡す人によってインスタンス化される可能性があります。または、Bの配列にアクセスする必要があるAのメソッドは、メンバーとしてBを持ち、したがってBの配列にアクセスできる人によって呼び出される可能性があります。

まだまだ選択肢があるかもしれません。

于 2012-04-05T11:08:09.203 に答える
0

アプリデリゲートで配列を取得します。プロパティを宣言し、アプリデリゲートで合成します。次に、クラスAにいるときは、次のようにします。

このコードをクラスAに記述します

Appdelegate *app = (AppDelegate *) [[UIApplication sharedApplication] delegate];
app.somearray = self.yourarray;

classBでは、このようにすることができます。

Appdelegate *app =(AppDelegate *) [[UIApplication sharedApplication] delegate];
NSLog(@"arr is %@",app.somearray);
于 2012-04-05T12:21:47.990 に答える