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 中,我有一个 tableView,我想从 ClassA 中获取所有数组。我怎样才能做到这一点?

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

在 ClassB 中实施时,上述内容似乎不起作用。

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

在这部分代码之后在 ClassA 中实现时,这也不起作用。"//...使用循环在此处添加数组的代码... [arrayToPass addObject:tempString];

请帮忙!!谢谢!

4

4 回答 4

2

您的代码不起作用的原因是因为fetchData:它是异步完成的,并且在代码运行arrayToPass时仍未填充。arrayReceived = ClassA.arrayToPass;

所以我们必须让我们ClassB知道这一点。首先在andClassADelegate之间声明一个协议,然后声明一个像这样的类型的属性怎么样: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;

然后在B类中获取A类的实例,您可以访问tempArrayclass_a_object.tempArray

于 2012-04-05T11:07:42.877 回答
0

在应用委托中取一个数组。声明属性并在应用委托中合成。然后当你在A类中时,就这样做

将这段代码写在 A 类中

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

在 B 类中,您可以这样做。

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

首先,您必须将类 A 中的数组声明为成员变量。并且 A 类需要一个返回它的方法(如果它是 @property,可以使用 @synthesize)。

现在,你有选择。B 类可以有一个 A 实例作为成员:然后它只向 A 询问数组(指针)。类 B 可以由将数组传递给 A 和 B 的人实例化。或者 A 中需要访问 B 数组的方法可以由具有 B 作为成员并因此可以访问 B 数组的人调用。

可能还有更多选择。

于 2012-04-05T11:08:09.203 回答