Это, наверное, глупый вопрос с легким ответом. Я новичок в 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];
}
Когда точно загружены данные? В viewDidLoad, viewDidAppear, другое? Показ некоторых из кода, который может помочь в загрузке данных. – Anna
действительно нет никакого кода в контроллере tableview для данных. Ничего в viewDidLoad или viewDidAppear. Я синтезирую locationDataController и использую это, чтобы вытащить информацию в ячейки таблицы. Поскольку я знаю, что есть данные, я начинаю задаваться вопросом, не потому ли, что это вытаскивает данные из Интернета и, возможно, еще не закончил загрузку и настройку данных до отображения контроллера таблицы? ??? – user469626