【问题标题】:Swift: Table Cells not setting up buttons correctlySwift:表格单元格未正确设置按钮
【发布时间】:2015-02-09 22:01:00
【问题描述】:

我一直在关注使用 swift 和 parse 的 yikyak 克隆的在线教程。我正在使用 coreData 存储赞成/反对的项目的 objectID。加载 tableview 单元格时,它会检查解析时的 objectID 是否在 coreData 中,并通过将背景图像添加到特定按钮并禁用赞成和反对按钮来做出相应的响应。但是,我遇到了一个问题,即上下滚动几次会导致随机单元格具有背景并禁用其按钮。

这里是代码的链接(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
}

跟异步处理有关系吗?

【问题讨论】:

  • 您应该将代码粘贴到帖子中,而不是链接它。到目前为止,您还尝试过什么?
  • 已编辑。我尝试创建 2 个名为 isUpvoted 和 isDownvoted 的新数组,并为每个项目存储一个真假。然后在 cellForRowAtIndexPath: 中检查它是否为真。如果是真的,它会将背景设置为蓝色,并且按钮将被禁用。 (赞成和反对投票)。我仍然有同样的问题。
  • 所以每次向上或向下滚动时它实际上都会创建新的单元格(您可以通过检查内存地址自己验证这一点)。您需要做的是存储您希望每个单元格具有的所有属性并在此方法中再次分配它们。

标签: ios uitableview swift core-data


【解决方案1】:

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>

然后通过并适当地重新初始化它。

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2018-09-22
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多