2017-08-30 9 views
0

なぜなら、私の配列に表示する項目が10種類あるにもかかわらず、私のtableViewは最近投稿された項目のデータを複数回表示しているからです。 など。では、10個の異なる項目をtableViewセルに表示するのではなく、10個のセルすべてに最新のポストを10回表示するだけです。なぜこれが起こっているのでしょうか?私は2つの異なるセル識別子を使用して問題を修正するかどうかを調べましたが、サイコロはありませんでした。以下のコードを参照してください。 cellForRow法でiOS/Obj-C - 同じデータを複数回表示するtableViewのセル?

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; 

    } 
+0

あなたの配列にはDublicateの値が含まれている可能性があります。 –

+1

resultArray [0]はresultArray [indexPath.row]である必要があります –

答えて

3

あなたの問題は、あなたがそれを

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

すべきであり、strong参照ではなく、フィルタcellForRow内のすべての時間を維持する方が良い

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

のようにセル内の配列の最初の要素だけを示しているですおよびnumberOfRow

@property (nonatomic, strong) NSArray *resultArray; 

し、データをWebサービスまたはローカルデータベース

のいずれかから来るときにそれを割り当てることが少し速くあなたのセルを作る

は、私は、これが理由のすべてであると信じて、それはあなた

+0

あなたは100%右です - ありがとうございます。私はこの答を受け入れます(私は5分待つ必要があると言います)。 – Brittany

+0

@Brittanyようこそ。まだ試してみてください。ハッピーコーディング –

0

、あなたはミスを犯した。

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

それがあたりとして表示されますので、あなたは、あなたのセルにあなたの現在のindexPathの行を与える必要があなたの行。

詳しくはindexPathをご確認ください。

1

に役立つことを願います同じユーザーIDでデータをフィルタリングしたときに、結果として常に同じ結果が表示されます。

結果配列は、常にOKその後、1を返します。そうでない場合、あなたはneighbourDetail含まれている何resultArray[0]

の代わりにresultArray[indexPath.row]を使用する必要がありますか?

0

cellForRowメソッドでは、常にresultArray [0]からデータを取り込みます。

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

indexPath.rowという式は、1行ごとに1ずつ増加し、基本的に行番号です。

希望します。

0

使用のUITableViewデリゲートとデータソースの方法で、このシンプルなコード

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; 
0

IndexPathあなたは正確にあなたが作業しているセクションとどの行を識別するのに役立ちます。アップルのドキュメントから

func cellForRow(indexPath:IndexPath) - > UITableViewCell?

パラメータIndexPathテーブルビューの行を特定するインデックスパス。

したがって、tableviewで作業しているときに、indexpathを使用して特定のセルにアクセスできます。セルを挿入したり、tableViewを使用しているときに、ハードコードされたインデックスではなくindexPathを使用します。 あなたの場合、resultArray[indexPath.row]を使用したはずのresultArray[0]を使用しています。

関連する問題