ios - 如果它们不包含数据,如何自动删除空的 UITableView 单元格?

标签 ios swift uitableview

编辑 1:对象声明(转到帖子底部)

我正在从 JSON(通过我的 API 下载)加载数据,出于某种原因,在过去的几天里,我的单元格显示为空,介于构建良好的单元格和实际数据之间。如何让这些空单元格自动消失? (所以单元格之间没有间隙)?

这是我从 JSON 创建对象的代码,以及我的数据源代码:

对象代码:

  func populateCurrentIssue() {
    if populatingCurrentIssue {
        return
    }

    populatingCurrentIssue = true

    self.cellLoadingIndicator.backgroundColor = UIColor.yellowColor()
    self.cellLoadingIndicator.startAnimating()

    Alamofire.request(GWNetworking.Router.Issue).responseJSON() { response in
        if let JSON = response.result.value {

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {

                var nodeIDArray : [Int]

                if (JSON .isKindOfClass(NSDictionary)) {

                    for node in JSON as! Dictionary<String, AnyObject> {

                        let nodeIDValue = node.0
                        var lastItem : Int = 0

                        if let issueElement : IssueElement = IssueElement(title: "Could not retrieve title", nodeID: 0, timeStamp: 0, imageURL: "init", author: "Author not found", issueNumber: "Issue # error", volumeNumber: "Volume # error", articleContent: "Could not retrieve article content", coverImageInteger: "init", coverImage: UIImage()) {

                            issueElement.title = node.1["title"] as! String
                            issueElement.nodeID = Int(nodeIDValue)!

                            let timeStampString = node.1["revision_timestamp"] as! String
                            issueElement.timeStamp = Int(timeStampString)!

                            issueElement.imageURL = String(node.1["image_url"])

                            if let author = node.1["author"] as? String {
                                issueElement.author = author
                            }

                            issueElement.volumeNumber = String(node.1["volume_int"])

                            if let articleContent = node.1["html_content"] as? String {
                                issueElement.articleContent = articleContent
                            }

                            issueElement.coverImageInteger = String(node.1["cover_image"]) // addition specific to the Current Issue View Controller

                            lastItem = self.currentIssueObjects.count

                            print(issueElement.nodeID)

                            self.currentIssueObjects.addObject(issueElement)


                            let timestampSortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
                            self.currentIssueObjects.sortUsingDescriptors([timestampSortDescriptor])



                            let coverImageSortDescriptor = NSSortDescriptor(key: "coverImageInteger", ascending: false)
                            self.currentIssueObjects.sortUsingDescriptors([coverImageSortDescriptor])

                            print(self.currentIssueObjects)

                            let indexPaths = (lastItem..<self.currentIssueObjects.count).map {
                                NSIndexPath(forItem: $0, inSection: 0) }
                            }
                        }

                    }

                dispatch_async(dispatch_get_main_queue()) {
                    self.currentIssueTableView.reloadData()

                    self.cellLoadingIndicator.stopAnimating()
                    self.cellLoadingIndicator.hidesWhenStopped = true

                }

            }

        }

        self.populatingCurrentIssue = false
}

数据源代码:

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

    let row = indexPath.row

    guard let cell = tableView.dequeueReusableCellWithIdentifier(CurrentIssueArticlesTableCellIdentifier, forIndexPath: indexPath) as? CurrentIssueArticlesTableViewCell else {

        print ("error: currentIssueTableView cell is not of class CurrentIssueArticlesTableViewCell, we will use EditorialsTableViewCell instead")
        return tableView.dequeueReusableCellWithIdentifier(CurrentIssueArticlesTableCellIdentifier, forIndexPath: indexPath) as! EditorialsTableViewCell
    }



    let currentIssueObject = currentIssueObjects.objectAtIndex(indexPath.row) as! IssueElement

        let title = currentIssueObject.title ?? ""

        let timeStampDateObject = NSDate(timeIntervalSince1970: NSTimeInterval(currentIssueObject.timeStamp))
        let timeStampDateString = dateFormatter.stringFromDate(timeStampDateObject) ?? "Date unknown"



    if let author = currentIssueObject.author {

        cell.currentIssueArticlesAuthorLabel!.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
        cell.currentIssueArticlesAuthorLabel!.text = author

    } else {
    }


        let issueNumber = currentIssueObject.issueNumber ?? ""
        let volumeNumber = currentIssueObject.volumeNumber ?? ""

        let articleContent = currentIssueObject.articleContent ?? ""

        let nodeID = currentIssueObject.nodeID ?? 0

        cell.currentIssueArticlesHeadlineLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
        cell.currentIssueArticlesHeadlineLabel.text = title



        cell.currentIssueArticlesPublishDateLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
        cell.currentIssueArticlesPublishDateLabel.text = timeStampDateString

        if row == 0 {

            cell.userInteractionEnabled = false

            let imageURL = (currentIssueObjects.objectAtIndex(row) as! IssueElement).imageURL

            cell.currentIssueArticlesHeadlineLabel.textColor = UIColor.clearColor()
            cell.currentIssueArticlesAuthorLabel.textColor = UIColor.clearColor()
            cell.currentIssueArticlesPublishDateLabel.textColor = UIColor.clearColor()

            cell.request?.cancel()

            if let image = self.imageCache.objectForKey(imageURL!) as? UIImage {
                cell.currentIssueArticlesBackgroundImageView.image = image
            } else {
                cell.currentIssueArticlesBackgroundImageView.image = UIImage(named: "reveal Image")
                cell.request = Alamofire.request(.GET, imageURL!).responseImage() { response in
                    if response.result.error == nil && response.result.value != nil {

                        self.imageCache.setObject(response.result.value!, forKey: response.request!.URLString)

                        cell.currentIssueArticlesBackgroundImageView.image = response.result.value
                    } else {

                    }

                }
            }


        }

        else {



        }

    if (cell.currentIssueArticlesAuthorLabel == nil) {
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    }

    return cell
}

编辑 1:对象声明

class IssueElement: NSObject {

var title: String           // title
var nodeID: Int             // nid
var timeStamp: Int          // revision_timestamp
var imageURL: String?      // image_url
var author: String?          // author

var issueNumber: String     // issue_int
var volumeNumber: String    // volume_int

var articleContent: String // html_content

var coverImageInteger: String // Variable that indicates whether this is the cover page or not (1 for cover, 0 for everything else)

var coverImage: UIImage

init(title: String, nodeID: Int, timeStamp: Int, imageURL: String?, author: String, issueNumber: String, volumeNumber: String, articleContent: String, coverImageInteger: String, coverImage: UIImage) {
    self.title = title
    self.nodeID = nodeID
    self.timeStamp = timeStamp
    self.imageURL = imageURL
    self.author = author
    self.issueNumber = issueNumber
    self.volumeNumber = volumeNumber
    self.articleContent = articleContent
    self.coverImageInteger = coverImageInteger
    self.coverImage = coverImage
}

override func isEqual(object: AnyObject!) -> Bool {
    return (object as! IssueElement).nodeID == self.nodeID
}

override var hash: Int {
    return (self as IssueElement).nodeID
}

}

最佳答案

实际上你不想那样做,因为途中会有额外的问题。例如,编辑单元格中的数据的最简单方法是将单元格的indexPath.row链接到数据源(例如,第二个单元格链接到数据源中的第二个元素,第三个元素链接到第三个元素,依此类推)。如果过滤单元格而不过滤数据,就会破坏此逻辑。

因此,最好的方法是过滤您的数据,只需在将空元素添加到 UITableView 之前删除它们。

关于ios - 如果它们不包含数据,如何自动删除空的 UITableView 单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264622/

相关文章:

swift - NSOpenPanel继承和 "designated initializer"

ios - 为什么搜索 FetchedResultsController 设置为 nil?

ios - View 上的 UISwipeGestureRecognizer - 如果触摸位于 UITableViewCell 内部,如何将其传递到单元格?

ios - 如何访问自定义单元格文本字段值?

ios - UIImagePickerController - 在相机上完成关闭(Swift)

iphone - NSString stringWithFormat 仪器内存泄漏

ios - 将 UITableView 添加为 subview 时,didSelectRowAtIndexPath 不会触发单元格

objective-c - 将图片从 assets-library 复制到 app 文件夹

ios - Swift:基类数组不调用子类函数实现

swift - 过滤子列表