Обмен данными между двумя классами - PullRequest
0 голосов
/ 13 сентября 2010

это мое первое приложение для iPhone, и я использую JSON Framework для декодирования JSON, отправленного с сервера.

Я вставляю данные в NSMutableArray из файла AppDelegate.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

   responseData = [[NSMutableData data] retain];
   museums = [[NSMutableArray alloc] init];
   viewController = [[RootViewController alloc] init];
   NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://my_json_link"]];
   [[NSURLConnection alloc] initWithRequest:request delegate:self];

   [window addSubview:navigationController.view];
   [window makeKeyAndVisible];

   return YES;
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed: %@", [error description]);
}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [responseData release];

    NSError *error;
    SBJSON *json = [[SBJSON new] autorelease];
    NSDictionary *data = (NSDictionary *)[json objectWithString:responseString error:&error];
    [responseString release];   

    if (data == nil)
        NSLog(@"JSON parsing failed: %@", [error localizedDescription]);
    else {
        for (NSDictionary *item in data) {

            // Read the data 
            NSString *aName = [item objectForKey:@"name"];
            NSString *aDescription = [item objectForKey:@"description"];

            // Create a new museum object with the data from json 
            Museum *museum = [[Museum alloc] initWithName:aName description:aDescription];

            // Add the museum object to the Array
            [museums addObject:museum];
            [museum release];
        }       
    }   
    viewController.museums = museums;  
}

Массив museums не пуст в функции connectionDidFinishLoading, но я не вижу его, когда пытаюсь распечатать его в RootViewController Я пытался установить массив в строке

viewController.museums = museums; 

но я не понял, что не так.

Я могу решить проблему, только если переместить эти строки:

[window addSubview:viewController.view];  
[window makeKeyAndVisible]; 

от первой функции к функции connectionDidFinishLoading. Но в этом случае не работает другое представление, когда я щелкаю одну запись таблицы.

Спасибо за любую помощь.

Ответы [ 4 ]

1 голос
/ 13 сентября 2010

Вы можете добавить в свой контроллер вида временно только для отладки:

-(void) setMuseums:(NSMutableArray*)m {
   self->_museums = [m retain];
}

, а затем добавить туда точку останова.Удостоверьтесь, что его ударили, или, может быть, что-то позже придет и установит его в ноль.

Свойство Museums объявлено как @property (nonatomic, retain) NSMutableArray * museums;право

1 голос
/ 13 сентября 2010
viewController = [[RootViewController alloc] init];

Во-первых, мне нужно, чтобы вы убедились, что viewController, который вы создаете в didFinishLaunching..., действительно является правильным viewController.Вы действительно подключили этот экземпляр к тому, что вы думаете, или вы два экземпляра os RootViewController?

Во-вторых, если вы на самом деле настраиваете музеи на правильный экземпляр RootViewController, вам нужно убедиться, чточто ваше время правильно.Это означает, что вы устанавливаете museums ДО того, как пытаетесь распечатать его в viewController

- Правка -

ОК, поскольку мы установили, что все происходит в неправильном порядке.должен попытаться перезагрузить таблицу.UITableView имеет метод reloadData, который позаботится об этом за вас, и вы должны вызывать его каждый раз, когда вы меняете источник данных после создания таблицы.

Поэтому в RootViewController добавьте метод с именем reload, который ввключите вызовы reloadData в UITableView и измените свой код:

viewController.museums = museums; 
[viewController reload];
0 голосов
/ 13 сентября 2010

Попробуйте поместить NSLog в цикл for и проверьте, выполняется ли он.

0 голосов
/ 13 сентября 2010

попробуйте использовать

viewController.museums = [museums retain];
...