难以将Array的内容写入tableview

时间:2014-02-20 13:52:24

标签: ios objective-c json

我一直在努力完成一项任务,包括从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"}}

4 个答案:

答案 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:

通过转到数组的每个对象并请求指定键的值来返回值数组。这在代码文档中非常清楚地解释了(代码完成甚至显示了一个带有链接的更多按钮)。

您尚未发布数据样本或TypesArrayNSArray还是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]];
 }

或类似的......

祝你好运!