Ios 如何根据用户选择筛选动态创建的tableview

Ios 如何根据用户选择筛选动态创建的tableview,ios,uitableview,swift,Ios,Uitableview,Swift,我想根据用户设置的字符串值筛选tableview。 tableview由一个由多个组件(图像、标签等)组成的单元格生成,所有组件都位于数组和字典的“混乱”中。我正在使用下面的代码。当我过滤时,我只是隐藏单元格,但它们仍然占据了tableview中的空间。 应用过滤器从而只获得符合要求的电池的最佳方法是什么? 我正在筛选的字段就是主题 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: N

我想根据用户设置的字符串值筛选tableview。 tableview由一个由多个组件(图像、标签等)组成的单元格生成,所有组件都位于数组和字典的“混乱”中。我正在使用下面的代码。当我过滤时,我只是隐藏单元格,但它们仍然占据了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
    }
}
override func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
如果过滤器选择==“所有”
{
var cell=tableView.dequeueReusableCellWithIdentifier(“NewsCell”)作为News\u TableViewCell
cell.subject!.text=subjects[indexPath.row]
如果videoEmbedCode.valueForKey(self.recordIDs[indexPath.row])!=nil
{
var iframeCode:NSString=videoEmbedCode.valueForKey(self.recordIDs[indexPath.row])作为字符串
var html=“\(iframeCode)”
cell.webView.loadHTMLString(html,baseURL:nil)
cell.webView.hidden=false
}否则,如果self.imageCache.valueForKey(self.recordIDs[indexPath.row])!=nil
{
cell.newimage.image=self.imageCache.valueForKey(self.recordIDs[indexPath.row])作为?UIImage
cell.newsImage.hidden=false
}否则
{
}
如果topics.valueForKey(self.recordIDs[indexPath.row])!=nil
{
cell.topicLabel.text=topics.valueForKey(self.recordIDs[indexPath.row])作为?字符串
}
其他的
{
cell.topicLabel.text=“”
}
返回单元
}
否则,如果topics.valueForKey(self.recordIDs[indexPath.row])作为?字符串==filterChoice
{
//仅返回具有指定主题的单元格
var cell=tableView.dequeueReusableCellWithIdentifier(“NewsCell”)作为News\u TableViewCell
如果topics.valueForKey(self.recordIDs[indexPath.row])!=nil
{
cell.topicLabel.text=topics.valueForKey(self.recordIDs[indexPath.row])作为?字符串
}
其他的
{
cell.topicLabel.text=“”
}
cell.subject!.text=subjects[indexPath.row]
如果videoEmbedCode.valueForKey(self.recordIDs[indexPath.row])!=nil
{
var iframeCode:NSString=videoEmbedCode.valueForKey(self.recordIDs[indexPath.row])作为字符串
var html=“\(iframeCode)”
cell.webView.loadHTMLString(html,baseURL:nil)
cell.webView.hidden=false
}否则,如果self.imageCache.valueForKey(self.recordIDs[indexPath.row])!=nil
{
cell.newimage.image=self.imageCache.valueForKey(self.recordIDs[indexPath.row])作为?UIImage
cell.newsImage.hidden=false
}否则
{
}
返回单元
}
其他的
{
var cell=UITableViewCell()
cell.hidden=true
返回单元
}
}

您需要在DataSource方法中跟踪单元格数量,该方法询问您当前节的单元格数量

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Here
}
如果您只是执行
cell.hidden=true
操作,空间不会消失,它只会隐藏内容。这是因为所有的单元布局都是用其他方法计算的

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

  • (最好)计算非隐藏单元格的数量,在
    func tableView(tableView:UITableView,numberofrowsinssection:Int)
    中返回新计数,并使用
    func tableView的信息重新计算字典(tableView:UITableView,cellforrowatinexpath indexath:nsindexath)
  • 这不是一个很好的解决方案,但对于你来说问题可能会发生。在方法中,要求tableView单元格高度
    func tableView(tableView:UITableView,heightForRowAtIndexPath:nsindepath)->CGFloat
    对于隐藏单元格只返回0

  • 你能详细说明一下吗?也许我有点困惑,你需要过滤表视图单元格,但是得到empy规范?代码运行良好。问题是返回空单元格不是一个好的解决方案。因为它仍然会占用tableview中的空间。我设想将主题存储在另一个数组中,然后与filter-string进行匹配。启发我的解决方案是:将所有单元格及其主题保存在一个数组中。将index.path保存在变量中。如果选择了主题,则使用index.path作为索引在新数组上迭代。通过这种方式,新阵列保持了旧阵列中特定单元的位置。嗯,没什么意义。但无论如何,我解决了它。感谢您的投入;-)