1

最初のセルのレイアウトが残りのセルと異なるテーブルを作成しようとしています。最初のセルの背景として画像を配置したい、つまり、次のように表示します。

ここに画像の説明を入力

これが私の実装のコードです

 func imageCellAtIndexPath(indexPath:NSIndexPath) -> MainTableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier(imageCellIdentifier) as MainTableViewCell
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject

    let eTitle:NSString = object.valueForKey("title")!.description
    let deTitle  = eTitle.stringByDecodingHTMLEntities()
cell.artTitle.text = deTitle


    var full_url = object.valueForKey("thumbnailURL")!.description
    var url = NSURL(string: full_url)
    var image: UIImage?
    var request: NSURLRequest = NSURLRequest(URL: url!)
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        image = UIImage(data: data)
        if((indexPath.row)==0)  {
        var imageView = UIImageView(frame: CGRectMake(10, 10, cell.frame.width - 10, cell.frame.height - 10))
        imageView.image = image
       cell.backgroundView = UIView()
      cell.backgroundView?.addSubview(imageView)

        }
        else{
        cell.thumb.image = image
        }
    })

    return cell
}

問題は..下にスクロールしてもう一度上にスクロールすると、背景画像が繰り返され始め、サムネイルも次のように重なって表示されます。 ここに画像の説明を入力

もう一度上下にスクロールすると、次のようになります。 ここに画像の説明を入力

私はばかげた間違いをしたかもしれませんが、それが何であるかを理解することはできません. 助けてください

4

2 に答える 2

3

テーブル ビューでは、セルが再利用されます。目的のセル スタイルの特定のバージョンに関連しないセルの部分をリセットする必要があります。何かのようなもの:

 if((indexPath.row)==0)  {
      let frame = CGRectMake(10, 10, 
                             cell.frame.width - 10, cell.frame.height - 10)
      var imageView = UIImageView(frame: frame)
      imageView.image = image
      cell.backgroundView = UIView()
      cell.backgroundView?.addSubview(imageView)

      // Reset 
      cell.thumb.image = nil
 } else{
      cell.thumb.image = image
      // Reset 
      cell.backgroundView = nil
 }

さらに優れた、より慣用的なアイデアはUITableViewCell、これら 2 つのセル タイプに別々の設計を使用し、それぞれに異なる再利用識別子を使用することです。この方法では、リセットを気にする必要はありません。

PSセルが返されることが保証されるため、 olddequeueReusableCellWithIdentifier:forIndexPath:の代わりに使用する必要があります。dequeueReusableCellWithIdentifier:

于 2015-02-18T08:50:04.957 に答える