-1

リモートデータベースからフェッチした文字列のリストがあり、それらは正常に表示されます。次に、文字列を追加すると、その新しい文字列がデータベースに正常に追加されますが、画面に表示するときに、何らかの理由で、最初と最後の両方の項目の最初の項目の値が表示されます。

これが私がしていることです:

// CREATING EACH CELL IN THE LIST
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"business";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if(!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17];
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    }

    cell.textLabel.text = [cellTitleArray objectAtIndex:indexPath.row];


    // CLOSE THE SPINNER
    [spinner stopAnimating];

    // return the cell for the table view
    return cell;
}

そして、データがデータベースから取得されるとき、これが私がすることです:

            dispatch_sync(dispatch_get_main_queue(), ^{

                items_array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

                if(!error){
                    [self loadTitleStrings];
                }

                [self.itemList reloadData];
            });

そしてこれが呼び出されるloadTitleStringsです

-(void)loadTitleStrings
{
    if(!standardUserDefaults)
    standardUserDefaults = [NSUserDefaults standardUserDefaults];
    NSString *is_private = [standardUserDefaults objectForKey:@"is_private"];

    if(!cellTitleArray)
    {
        cellTitleArray = [NSMutableArray array];
    }

    for(NSDictionary *dictionary in items_array)
    {
        NSString *tcid = [dictionary objectForKey:@"comment_id"];        
        [theArray addObject:tcid];

        NSString *string;
        if(!is_private || [is_private isEqualToString:@"0"])
        {
            string = [NSString stringWithFormat:@"%@: %@", [dictionary objectForKey:@"first_name"], [dictionary objectForKey:@"comment"]];
        }
        else
        {
            string = [NSString stringWithFormat:@"%@", [dictionary objectForKey:@"comment"]];
        }
        [cellTitleArray addObject:string];
    }
}

最後のアイテムが最初のアイテムの値で表示される理由を誰かが知ることができますか?私は本当に困惑しています!

ありがとう!

4

1 に答える 1

1

cellTitleArrayはインスタンス変数だと思いますか?その場合、2回目にloadTitleStringsを呼び出すと(リモートデータベースに新しい文字列を追加してすべての文字列を再度取得した後)、cellTitleArrayが現在使用している文字列になります。たぶん、すべての文字列をもう一度追加します。このような状況の場合は、-loadTitleStringsのforeachループの前に[cellTitleArrayremoveAllObjects]を追加できます。

そして、おそらくあなたの2番目の文字列でエラーが発生しました。私はあなたのコードとして行うのは良い考えではないと思います:

items_array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

if(!error){
   [self loadTitleStrings];
}

エラーパラメータにnilを渡した場合、もちろんエラーはnilになります。エラーが発生した場合、通知を受けることはできません。これを試して、エラーがあるかどうかを確認してください。

NSError *error = nil;
items_array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

if(!error){
   [self loadTitleStrings];
} else {
    NSLog(@"%@",error);
}
于 2012-12-17T23:01:00.030 に答える