我一直在努力完成一项任务,包括从json(从链接)获取值,将其写入数组,然后将其插入我的行中
cell.textLabel.text=[myArray objectAtIndex:indexPath.row];
获取方法
-(void)getData:(NSData *) responseData{
NSError *error;
NSDictionary *json=[NSJSONSerialization JSONObjectWithData:responseData option:kNilOptions error:&error[;
myArray=[json objectForKey:@"cars"];
NSLog(@"cars %@",myArray);//returns array values just fine
}
NSLog 关于完美地返回我的数组, 但是,当我说
cell.textLabel.text=[myArray objectAtIndex:indexPath.row];
它是null,(我认为这是因为这个代码在getData方法之前运行,即使我在加载方法中写出数组的URL并将其记录在那里并获取我的数组,当我尝试分配它时到一个单元格,我再次得到null。 如果我能够解决这个问题,真的很喜欢。谢谢 添加了代码
编辑:添加了代码,解决了之前的问题,但现在尝试将TypesArray(字典)的值显示在我的单元格标签中。或者我应该把JSon变成Array格式。
Json Data是{"regions":{"region":"House"}
但不允许我格式化为数组
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
#define kmyURL [NSURL URLWithString:@"http://www.site.com/region/index.php"]
- (void)viewDidLoad
{
[super viewDidLoad];
NSURL *myURL =[NSURL URLWithString:@"http://www.site.com/region/index.php"];
NSError *error=nil;
NSString *str=[NSString stringWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@",str);
// sqlResults=[NSArray arrayWithContentsOfURL:myURL];
dispatch_async(kBgQueue, ^{
NSData *data=[NSData dataWithContentsOfURL:kmyURL];
[self performSelectorOnMainThread:@selector(fetchedData:) withObject: data waitUntilDone:YES];
});
}
-(void)fetchedData:(NSData *)responseData{
NSError *error;
NSDictionary *json=[NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
myarr=[json valueForKey:@"regions"];
NSLog(@"regions: %@",myarr);
TypesArray =[[NSDictionary alloc]initWithDictionary:json];
NSLog(@"json %@",TypesArray);
[self.tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
}
NSLog(@"Sql Results: %@",sqlResults);
NSLog(@"regions out: %@",myarr);
NSLog(@"Typesb: %@",TypesArray);
cell.textLabel.text=[TypesArray valueForKey:@"region"]; //Nothing is being written to cell here
return cell;
}
数据看起来像这样:
{"regions":{"region":"Island"}}
答案 0 :(得分:1)
您的代码存在几个主要问题。
首先,您使用[NSData dataWithContentsOfURL:]
从非本地链接获取数据。即使在后台线程中执行它也是一个坏主意。来自Class Reference:
重要说明:请勿使用此同步方法请求基于网络的方法 网址。对于基于网络的URL,此方法可以阻止当前线程 在慢速网络上持续数十秒,导致用户不畅 经验,在iOS中,可能会导致您的应用被终止。代替, 对于非文件URL,请考虑使用 dataTaskWithURL:completionHandler:NSSession类的方法。看到 URL加载系统编程指南了解详细信息。
你的整体线程很乱。我建议使用AFNetworking框架来简化线程。这将允许您从显示的代码中删除所有线程逻辑。
接下来,您的NSArray
似乎是NSDictionary
个对象的数组。您可能需要将标签文本分配更改为:
cell.textLabel.text = myArray[indexPath.row][@"car"];
答案 1 :(得分:1)
首先获取数据后,重新加载tableview
-(void)getData:(NSData *) responseData
{
NSError *error;
NSDictionary *json=[NSJSONSerialization JSONObjectWithData:responseData option:kNilOptions error:&error[;
myArray=[json objectForKey:@"cars"];
NSLog(@"cars %@",myArray);
//here reload the table
[yourTableObject reloadData];
}
使用以下
将数据从数组分配到表格单元格cell.textLabel.text =[[myArray objectAtIndex:indexPath.row] objectForKey:@"car"];
答案 2 :(得分:1)
您对NSArray
函数和NSDictionary
函数感到困惑。
valueForKey:
通过转到数组的每个对象并请求指定键的值来返回值数组。这在代码文档中非常清楚地解释了(代码完成甚至显示了一个带有链接的更多按钮)。
您尚未发布数据样本或TypesArray
是NSArray
还是NSDictionary
(请注意,变量的开头不应包含大写字母)。
如果是NSDictionary
,请使用:
[TypesArray objectForKey:@"region"];
如果它是NSDictionary
的数组
[[TypesArray objectAtIndex:indexPath.row] objectForKey:@"region"];
对于上述内容,请注意您是将其定义为NSArray
还是NSDictionary
并不重要。重要的是从webservice调用返回的内容。使用[ class]
和[ isKindOfClass:]
进行检查。
请将来发布包含对象定义和数据样本的所有代码,无论您在哪里说“打印X”,请向我们出示打印件。最后你说你打印出字典,这很好,但获得一个值不是更新标签,打印出你想要获得的价值,并再次向我们展示。我们无法猜测这些东西,这就是为什么没有人能够回答的问题。
答案 3 :(得分:0)
也许试试这个:
NSError * deserializationError = nil;
CJSONDeserializer *deserializer = [CJSONDeserializer deserializer];
NSDictionary *dict = [deserializer deserialize:conn error:&deserializationError];
NSDictionary * response = [dict objectForKey:@"cars"];
ArrayCells = [[NSMutableArray alloc] initWithCapacity:[response count]];
for (int index = 0; index < [response count]; index--) {
NSMutableDictionary * value = [response objectAtIndex:index];
CustomCell *cell = [[CustomCell alloc] init];
cell.car = [value objectForKey:@"car"];
[ArrayCells addObject:cell];
}
和
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return [ArrayCells objectAtIndex:[indexPath section]];
}
或类似的......
祝你好运!