iOS / Obj-C - tableView中的单元格多次显示相同的数据?

时间:2017-08-30 04:44:58

标签: ios objective-c uitableview

出于某种原因,我的tableView多次显示我最近发布的项目的数据,即使我的数组中有10个不同的项目要显示。 例如而不是在我的tableView单元格中显示10个不同的项目,它只是在所有10个单元格中显示最近的帖子10次?知道为什么会这样吗?我尝试使用两个不同的单元格标识符来查看是否可以解决问题,但没有骰子。请参阅下面的代码。

ViewController.m

- (int)numberOfSectionsInTableView: (UITableView *)tableview

{
    return 1;

}


- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{


       if (neighbourDetail > 0 ) {


           NSString *thisUserId = [neighbourDetail objectForKey:@"uid"];


           NSPredicate *predicate = [NSPredicate predicateWithFormat:@"targetuser CONTAINS[cd] %@",
                                     thisUserId];

          NSArray *resultArray = [self.reviewData filteredArrayUsingPredicate:predicate];


           return [resultArray count];

} else {


    NSString *thisUserId = [self.myFriendData objectForKey:@"uid2"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"targetuser CONTAINS[cd] %@",
                              thisUserId];

   NSArray *resultArray = [self.reviewData filteredArrayUsingPredicate:predicate];

    return [resultArray count];


}

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


    if (neighbourDetail > 0 ) {

        static NSString *DogTableIdentifier = @"ReviewTableViewCell";

        ReviewTableViewCell *cell = (ReviewTableViewCell *)[tableView dequeueReusableCellWithIdentifier:DogTableIdentifier];
        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ReviewTableViewCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];

        }
        NSString *thisUserId = [neighbourDetail objectForKey:@"uid"];


        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"targetuser CONTAINS[cd] %@",
                                  thisUserId];

        NSArray *resultArray = [self.reviewData filteredArrayUsingPredicate:predicate];



        NSString *reviewDes = resultArray[0][@"body"];
        cell.reviewText.text = reviewDes;


        NSString *firstName = resultArray[0][@"from first"];
        cell.firstText.text = firstName;


        NSString *timeStamp = resultArray[0][@"published at"];
        cell.timeText.text = timeStamp;

        NSString *secondLink = resultArray[0][@"from photo"];


        [cell.profilePic sd_setImageWithURL:[NSURL URLWithString:secondLink]];

        return cell;


    } else if (neighbourDetail == NULL)  {

        static NSString *DogTableIdentifier2 = @"ReviewTableViewCell";

        ReviewTableViewCell *cellTwo = (ReviewTableViewCell *)[tableView dequeueReusableCellWithIdentifier:DogTableIdentifier2];
        if (cellTwo == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ReviewTableViewCell" owner:self options:nil];
            cellTwo = [nib objectAtIndex:0];

        }

        NSString *thisUserId = [self.myFriendData objectForKey:@"uid2"];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"targetuser CONTAINS[cd] %@",
                                  thisUserId];

        NSArray *resultArray = [self.reviewData filteredArrayUsingPredicate:predicate];


        NSString *reviewDes = resultArray[0][@"body"];
        cellTwo.reviewText.text = reviewDes;

        NSString *firstName = resultArray[0][@"from first"];
        cellTwo.firstText.text = firstName;


        NSString *timeStamp = resultArray[0][@"published at"];
        cellTwo.timeText.text = timeStamp;

        NSString *secondLink = resultArray[0][@"from photo"];


        [cellTwo.profilePic sd_setImageWithURL:[NSURL URLWithString:secondLink]];


        return cellTwo;
    }

    return 0;

    }

6 个答案:

答案 0 :(得分:3)

您的问题是您只在单元格中显示数组的第一个元素,如

NSString *reviewDes = resultArray[0][@"body"];

应该是

NSString *reviewDes = resultArray[indexPath.row][@"body"];

最好保留strong参考,而不是每次都在cellForRownumberOfRow

进行过滤

喜欢

@property (nonatomic, strong) NSArray *resultArray;

并在数据来自Webservice或本地数据库

时分配

它使你的细胞更快一点

希望它对你有所帮助

答案 1 :(得分:1)

我相信这是因为每次使用相同的用户ID过滤数据时,结果都会显示相同的结果。

如果结果数组总是返回1然后确定它,否则你必须使用resultArray[indexPath.row]而不是resultArray[0]

neighbourDetail包含什么?

答案 2 :(得分:0)

在cellForRow方法中,你犯了一个错误:

resultArray[0] --> resultArray[indexPath.row]

您需要将当前indexPath的行提供给您的单元格,因此它将根据您的行显示。

详细了解indexPath

答案 3 :(得分:0)

在cellForRow方法中,您始终从resultArray [0]填充数据。

    resultArray[0] ----> resultArray[indexPath.row]

表达式indexPath.row每行递增1,基本上是行号。

希望它有所帮助。

答案 4 :(得分:0)

使用此简单代码

 NSArray *resultArray = [self.reviewData filteredArrayUsingPredicate:predicate];

NSDictionary*dict=[resultArray objectAtIndex:indexPath.row];
cellTwo.reviewText.text = [dict valueForKey:@"body"];
cellTwo.firstText.text = [dict valueForKey:@"from"];
cellTwo.timeText.text = [dict valueForKey:@"published at"];

NSString *secondLink = [dict valueForKey:@"from photo"];


[cellTwo.profilePic sd_setImageWithURL:[NSURL URLWithString:secondLink]];


return cellTwo;

答案 5 :(得分:0)

UITableView委托和数据源方法中的IndexPath将帮助您准确识别您正在处理的部分和行。来自苹果文档

  

func cellForRow(在indexPath:IndexPath) - >的UITableViewCell?

     

参数 IndexPath 在tableview中定位行的索引路径。

因此,当您使用tableview时,可以使用indexpath访问特定单元格。在填充单元格或同时选择tableView时使用indexPath而不是硬编码索引。 在您的情况下,您已使用resultArray[0],您应该使用resultArray[indexPath.row]