如何根据用户选择过滤动态创建的tableview

时间:2015-02-20 12:10:18

标签: ios uitableview swift

我想根据用户设置的String值过滤tableview。 tableview是由一个由几个组件(图像,标签等)组成的单元格生成的,所有这些组件都位于" mess"数组和词典。我正在使用下面的代码。当我过滤我只是隐藏单元格,但它们仍占用了tableview中的空间。 应用过滤器的最佳方法是什么,从而只获得符合要求的电池? 我过滤的字段是主题。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if filterChoice == "Alle"
    {
        var cell = tableView.dequeueReusableCellWithIdentifier("NewsCell") as News_TableViewCell
        cell.subject!.text = subjects[indexPath.row]
        if videoEmbedCode.valueForKey(self.recordIDs[indexPath.row]) != nil
        {
            var iframeCode: NSString = videoEmbedCode.valueForKey(self.recordIDs[indexPath.row]) as String
            var html = "<html><body>\(iframeCode)</body></html>"
            cell.webView.loadHTMLString(html, baseURL :nil)
            cell.webView.hidden = false
        } else if self.imageCache.valueForKey(self.recordIDs[indexPath.row]) != nil
        {
            cell.newsImage.image = self.imageCache.valueForKey(self.recordIDs[indexPath.row]) as? UIImage
            cell.newsImage.hidden = false
        } else
        {
        }
        if topics.valueForKey(self.recordIDs[indexPath.row]) != nil
        {
            cell.topicLabel.text = topics.valueForKey(self.recordIDs[indexPath.row]) as? String
        }
        else
        {
            cell.topicLabel.text = ""
        }
        return cell
    }
    else if topics.valueForKey(self.recordIDs[indexPath.row]) as? String == filterChoice
    {
        //Only return cells with specified topic
        var cell = tableView.dequeueReusableCellWithIdentifier("NewsCell") as News_TableViewCell
        if topics.valueForKey(self.recordIDs[indexPath.row]) != nil
        {
            cell.topicLabel.text = topics.valueForKey(self.recordIDs[indexPath.row]) as? String
        }
        else
        {
            cell.topicLabel.text = ""
        }

        cell.subject!.text = subjects[indexPath.row]

        if videoEmbedCode.valueForKey(self.recordIDs[indexPath.row]) != nil
        {
            var iframeCode: NSString = videoEmbedCode.valueForKey(self.recordIDs[indexPath.row]) as String
            var html = "<html><body>\(iframeCode)</body></html>"
            cell.webView.loadHTMLString(html, baseURL :nil)
            cell.webView.hidden = false
        } else if self.imageCache.valueForKey(self.recordIDs[indexPath.row]) != nil
        {
            cell.newsImage.image = self.imageCache.valueForKey(self.recordIDs[indexPath.row]) as? UIImage
            cell.newsImage.hidden = false
        } else
        {
        }
        return cell
    }
    else
    {
        var cell = UITableViewCell()
        cell.hidden = true
        return cell
    }
}

1 个答案:

答案 0 :(得分:0)

您需要跟踪DataSource方法中的单元格数量,它会询问您当前部分的单元格数。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Here
}

如果您只是cell.hidden = true空间不会消失,它只会隐藏内容。这是因为所有单元格布局都是用其他方法计算的。

如果要隐藏此类单元格的空间,可以选择多种解决方案:

  1. (最佳)计算非隐藏单元格的数量,返回func tableView(tableView: UITableView, numberOfRowsInSection section: Int)中的新计数并使用func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
  2. 的信息重新计算字典
  3. 这不是一个好的解决方案,但可以解决您的问题。在方法中,要求tableView单元格高度func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat只为隐藏单元格返回0。