2010-10-08 7 views
1

Это, наверное, глупый вопрос с легким ответом. Я новичок в iOS dev, и это убивает меня.iphone tab bar app view жизненный цикл вопрос

У меня есть основное приложение панели вкладок. Приложение загружает начальную вкладку при запуске и является контроллером таблицы. Данные для этого представления таблицы предоставляются datacontroller, где он создает массив из данных, полученных из Интернета. Когда я впервые запускаю приложение, в представлении таблицы ничего не отображается, оно пустое. Однако, если я выберу другую вкладку, а затем вернусь к этой вкладке, данные теперь будут отображаться и отображаться в представлении таблицы, как и должно быть. Как получить данные для отображения в первый раз? Это очевидно. Я считаю, что это может быть связано с тем, где/когда данные загружаются, что вызывает проблему, любое понимание было бы замечательным.

Это устанавливает datacontroller в приложение делегата:

// Create Locations data controller. 
LocationDataController *controller = [[LocationDataController alloc] init]; 
self.locationDataController = controller; 
[controller release]; 
locationsViewController.locationDataController = locationDataController; 

Вот код datacontroller:

@implementation LocationDataController 
@synthesize fetchConnection = mFetchConnection; 
@synthesize locations, tempLocations; 



-(id)initData { 
    if (self = [super init]) { 
     [self createData]; 
    } 
    return self; 
} 

-(id)init { 
    [self fetchData]; 
    return self; 
} 


-(unsigned)countOfList { 
    return [locations count]; 
} 


-(Location *)objectInListAtIndex:(unsigned)theIndex { 
    return [locations objectAtIndex:theIndex]; 
} 


-(void)dealloc { 
    [locations release]; 

    if (mFetchConnection != nil) { 
     [mFetchConnection cancel]; 
     [mFetchConnection release]; 
    } 

    if (mFetchConnectionBuffer != nil) 
     [mFetchConnectionBuffer release]; 

    [super dealloc]; 
} 


#pragma mark - 
#pragma mark Fetching/Sending Data 
#pragma mark 

- (void)fetchData { 
    if (mFetchConnection == nil) { 
     if (mFetchConnectionBuffer != nil) 
      [mFetchConnection release]; 

     mFetchConnectionBuffer = [[NSMutableData alloc] init]; 

     NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:kFetchURLPath]]; 
     self.fetchConnection = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES] autorelease]; 
     [request release]; 
    } 
} 




#pragma mark - 
#pragma mark NSURLConnection Delegate 
#pragma mark 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)inData { 
    if (connection == mFetchConnection) { 
     [mFetchConnectionBuffer appendData:inData]; 
    } 
} 




- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)connectionError { 
    if (connection == mFetchConnection) { 
     self.fetchConnection = nil; 
     [mFetchConnectionBuffer release]; 
     mFetchConnectionBuffer = nil; 
    } 
} 



- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    tempLocations = [[NSMutableArray alloc] init]; 

    if (connection == mFetchConnection) { 
     NSString *str = [[NSString alloc] initWithData:mFetchConnectionBuffer encoding:NSUTF8StringEncoding]; 
     SBJSON *parser = [[SBJSON alloc] init]; 
     id result = [parser objectWithString:str error:nil]; 
     if (result != nil && [result isKindOfClass:[NSArray class]]) 
      [tempLocations setArray:result]; 
     [str release]; 
     [mFetchConnectionBuffer release]; 
     mFetchConnectionBuffer = nil; 
     self.fetchConnection = nil; 

     [self initData]; 

    } 
} 


-(void)createData { 

    // Cycle through array to implement locations. 
    Location *location; 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 

    // create arry of locations. 
    for (int i=0; i<[tempLocations count];i++) { 

     location = [[Location alloc] init]; 
     location.name = [[tempLocations objectAtIndex:i] objectForKey:@"name"]; 
     location.address = [[tempLocations objectAtIndex:i] objectForKey:@"address"]; 
     location.city = [[tempLocations objectAtIndex:i] objectForKey:@"city"]; 
     location.state = [[tempLocations objectAtIndex:i] objectForKey:@"state"]; 
     location.zip = [[tempLocations objectAtIndex:i] objectForKey:@"zip"]; 

     [array addObject:location]; 
     [location release]; 

    } 

    self.locations = array; 
    [array release]; 
    [tempLocations release]; 

} 
+0

Когда точно загружены данные? В viewDidLoad, viewDidAppear, другое? Показ некоторых из кода, который может помочь в загрузке данных. – Anna

+0

действительно нет никакого кода в контроллере tableview для данных. Ничего в viewDidLoad или viewDidAppear. Я синтезирую locationDataController и использую это, чтобы вытащить информацию в ячейки таблицы. Поскольку я знаю, что есть данные, я начинаю задаваться вопросом, не потому ли, что это вытаскивает данные из Интернета и, возможно, еще не закончил загрузку и настройку данных до отображения контроллера таблицы? ??? – user469626

ответ

0

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

+0

Я пробовал это, но, похоже, не повезло. - [self.tableView reloadData] это было в viewWillApear. Также попробовал в viewDidLoad без везения. – user469626

+0

Вы загружаете данные асинхронно, чтобы данные не были готовы, когда вы его вызывали. Просто догадка. – Max

+0

Это был вывод, к которому я начинал приходить, любые мысли/идеи о том, что я могу сделать, чтобы его пересмотреть. Я немного растерялся, как подойти к решению этой проблемы. Он работает, но кажется, что он отображает представление до того, как данные будут готовы, и я не уверен, как исправить проблему в схеме вещей. – user469626

Смежные вопросы