2015-02-09 68 views
-1

我一直在使用swift和parse在线学习yikyak克隆的教程。我正在使用coreData存储upvoted/downvoted项目的objectID。当tableview单元格被加载时,它会检查parse中的objectID是否在coreData中,并通过将背景图像添加到特定按钮并禁用向上和向下按钮来响应。不过,我面临的一个问题是,上下滚动几次会导致随机单元格具有背景并禁用其按钮。Swift:Table Cells没有正确设置按钮

这里是代码(:)的cellForRowAtIndexPath链接:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as PullTableViewCell 
    let restaurant = self.restaurantData[indexPath.row] 
    cell.scoreLabel.text = "\(score)" 

    cell.plusButton.tag = indexPath.row; 
    cell.plusButton.addTarget(self, action: "plusOne:", forControlEvents: .TouchUpInside) 
    cell.minusButton.tag = indexPath.row 
    cell.minusButton.addTarget(self, action: "minusOne:", forControlEvents: .TouchUpInside) 

    if (cell.plusButton.enabled) { 
     // upvotes 
     let request = NSFetchRequest(entityName: "Upvotes") 
     let moc:NSManagedObjectContext = self.managedObjectContext! 

     var error: NSErrorPointer = nil 
     self.upvoteData = moc.executeFetchRequest(request, error: error) as [Upvotes] 

     for (var i = 0; i < self.upvoteData.count; i++) { 
      if (self.upvoteData[i].objectid == self.objectIDs[indexPath.row]) { 
       NSLog("the cell is in view is \(indexPath.row)") 
       cell.plusButton.backgroundColor = UIColor.blueColor() 
       cell.minusButton.enabled = false 
       cell.plusButton.enabled = false 
      } 
     } 

     // downvotes 
     let request2 = NSFetchRequest(entityName: "Downvotes") 
     let moc2:NSManagedObjectContext = self.managedObjectContext! 

     var error2: NSErrorPointer = nil 
     self.downvoteData = moc2.executeFetchRequest(request2, error: error2) as [Downvotes] 

     for (var i = 0; i < self.downvoteData.count; i++) { 
      if (self.downvoteData[i].objectid == self.objectIDs[indexPath.row]) { 
       cell.minusButton.backgroundColor = UIColor.blueColor() 
       cell.minusButton.enabled = false 
       cell.plusButton.enabled = false 
      } 
     } 

    } 
    return cell 
} 

是否有异步处理呢?

+0

你应该把你的代码粘贴到帖子里面而不是链接它。你到目前为止还尝试过什么? – Aggressor 2015-02-09 22:06:38

+0

编辑它。我试图创建2个新的数组,名为isUpvoted和isDownvoted,并为每个项目存储true和false。然后在cellForRowAtIndexPath中:它会检查它是否为真。如果它是真的,它会将背景设置为蓝色,并且按钮将被禁用。 (上下投票)。我仍然有同样的问题。 – Young 2015-02-09 22:15:22

+0

所以它实际上每次向上或向下滚动都会创建新的单元格(您可以通过检查内存地址自行验证)。你需要做的是存储你想要的每个单元格的所有属性,并在这个方法中再次分配它们。 – Aggressor 2015-02-09 22:18:27

回答

0

当你上下滚动时,tableview实际上会重新创建单元格。所以当一个单元格滚动出视图时,它可能会被破坏并重新创建。

您需要在地图内部存储单元格属性,然后每次重新初始化单元格。

下面是我自己的代码示例:

public func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    { 
     var cell = collectionView.dequeueReusableCellWithReuseIdentifier("selectPhotoCell", forIndexPath: indexPath) as B_SelectPhotoControllerViewCell 
     cell.indexPath = indexPath 
     let asset = currentAssetAtIndex(indexPath.item) 
     PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:_cellSize, contentMode: .AspectFit, options: nil) 
     { 
      result, info in 
      if(cell.indexPath == indexPath) 
      { 
       cell.imageView.image = result 
       cell.imageView.frame = CGRectMake(0, 0,self._cellSize.width,self._cellSize.height) 
       for editImage in self._editImageChicklets 
       { 
        if(editImage.selectedPhotoIndexPath != nil && editImage.selectedPhotoIndexPath == indexPath) 
        { 
         cell.number = editImage.selectedPhotoDisplayNumber! 
        } 
       } 
      } 
     } 
     return cell 
    } 

这是一个使用照片图像从用户照片辊上的UICollectionView的例子。我跟踪indexPath,如果匹配,那么我将图像分配给属性。

在你的情况下,你需要做同样的事情。保留单元格属性和索引路径的地图:

Dictionary<NSIndexPath,CustomCellPropertiesObject> 

然后重新进行适当的初始化。