这是我的第一个iPhone应用程序,我正在使用JSON框架来解码从服务器发送的JSON。
我将数据从AppDelegate文件插入NSMutableArray。
- (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;
}
在connectionDidFinishLoading函数中,museums数组不是空的,但是当我尝试在RootViewController中打印它时,我看不到它。 我试着在行
中设置数组viewController.museums = museums;
但我不明白出了什么问题。
只有移动这些行,我才能解决问题:
[window addSubview:viewController.view];
[window makeKeyAndVisible];
从第一个函数到connectionDidFinishLoading函数。但是在这种情况下,当我单击表中的一条记录时,其他视图不起作用。
感谢您的帮助。
答案 0 :(得分:1)
viewController = [[RootViewController alloc] init];
首先,我要求您确保在viewController
中创建的didFinishLaunching...
实际上是正确的viewController
。您是否真的将该实例连接到您认为的实例或者您是两个实例os RootViewController
?
其次,如果您实际在RootViewController
的正确实例上设置博物馆,则需要确保您的时间安排正确。这意味着您在尝试在museums
viewController
- 编辑 -
好的,因为我们确定事情发生的顺序错误,你应该尝试重新加载表格。 UITableView有一个名为reloadData的方法,它将为您处理这个问题,并且您需要在创建表后每次更改数据源时调用它。
因此在RootViewController中添加一个名为reload的方法,该方法又调用UITableView上的reloadData并修改代码:
viewController.museums = museums;
[viewController reload];
答案 1 :(得分:1)
您可以暂时添加到视图控制器以进行调试:
-(void) setMuseums:(NSMutableArray*)m {
self->_museums = [m retain];
}
然后在那里添加一个断点。确保它被击中,或者可能稍后出现并将其设置为零。
博物馆属性被声明为@property(非原子,保留)NSMutableArray *博物馆;正确?
答案 2 :(得分:0)
尝试将NSLog置于for循环中并检查它是否已执行。
答案 3 :(得分:-1)
尝试使用
viewController.museums = [museums retain];