如何在Swift中使用UISegmentedControl筛选表视图单元格?

如何在Swift中使用UISegmentedControl筛选表视图单元格?,swift,uitableview,swift2,uisegmentedcontrol,Swift,Uitableview,Swift2,Uisegmentedcontrol,在提问之前我已经搜索过了,但是我没有找到我需要的 我正在构建这个应用程序,用户在其中放置一个任务(不去应用程序商店,只为我和一些朋友),并且任务有一个类别。例如:学校、家庭、朋友等。当用户要添加新任务时,有两个文本字段,描述文本字段和类别文本字段。我正在使用UIPickerView,因此用户选择一个类别,然后在创建新任务后,它会将该类别添加到我创建的名为“categories”的数组中 我想在表视图的顶部放置一个UISegmentedControl,其中包含以下部分: 所有-学校-家庭-朋友 如

在提问之前我已经搜索过了,但是我没有找到我需要的

我正在构建这个应用程序,用户在其中放置一个任务(不去应用程序商店,只为我和一些朋友),并且任务有一个类别。例如:学校、家庭、朋友等。当用户要添加新任务时,有两个文本字段,描述文本字段和类别文本字段。我正在使用UIPickerView,因此用户选择一个类别,然后在创建新任务后,它会将该类别添加到我创建的名为“categories”的数组中

我想在表视图的顶部放置一个UISegmentedControl,其中包含以下部分:

所有-学校-家庭-朋友

如果选择“全部”,则将显示所有单元格,不进行过滤。如果没有,它将显示具有相应类别的单元格

我已经读到,我需要为每个类别创建表视图部分,但这将极大地改变我的代码,我甚至不知道如何使用多个表视图部分,我尝试过一次,但它在第二次中不断重复一个部分的单元格

那么我如何过滤每个类别的单元格呢

我可以举个例子吗

if //code to check in which section the picker is here {
   if let schoolCell = cell.categories[indexPath.row] == "School" {
        schoolCell.hidden = true
   }
}
请帮帮我

编辑:

我现在有这个代码:

if filterSegmentedControl.selectedSegmentIndex == 1 {
            if categories[indexPath.row] == "School" {

            }
    }

我只是不知道接下来该怎么办。如何识别和隐藏单元格?

这取决于您的tableview

如果使用NSFetchedResultsController,则需要修改提取请求。如果直接使用数组,只需在Swift中使用filter函数,传入条件,例如
filteredArray=array.filter{$0.isAudioFile}
,然后在将数据源数组设置为筛选数组后,在tableview上调用
reloadData


您需要保留对完整数组的引用,并在
cellForRow…

中使用过滤后的数组作为您的数据源。在我看来,您可能需要先采取一种更简单的方法,然后让它工作起来。设置ViewController,并为表数据添加一个tableView和两(2)个数组。一个在家,另一个在工作。是的,我知道这很简单,但如果你能让它工作起来,那么你就可以在它的基础上再接再厉

添加变量以跟踪正在显示的数据

@IBOutlet var segmentedControl: UISegmentedControl!
@IBOutlet var tableView: UITableView!

// You would set this to 0, 1 or 2 for home, work and all.
var dataFilter = 0

// Data for work tasks    
var tableDataWork : [String] = ["Proposal", "Send mail", "Fix printer", "Send payroll", "Pay rent"]
// Data for home tasks
var tableDataHome : [String] = ["Car payment", "Mow lawn", "Carpet clean"]
为分段控件添加这些函数

@IBAction func segmentedControlAction(sender: AnyObject) {

    switch segmentedControl.selectedSegmentIndex {

        case 0:
            print("Home")
            dataFilter = 0
        case 1:
            print("Work")
            dataFilter = 1
        case 2:
            print("All")
            dataFilter = 2
        default:
            print("All")
            dataFilter = 2
    }
    reload()

}

func reload() {
    dispatch_async( dispatch_get_main_queue()) {
        self.tableView.reloadData()
    }
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("task-cell")

    var title: String?
    switch dataFilter {
        case 0:
            title = tableDataHome[indexPath.row]
        case 1:
            title = tableDataWork[indexPath.row]
        case 2:
            if indexPath.row < tableDataWork.count {
                title = tableDataWork[indexPath.row]
            } else {
                title = tableDataHome[indexPath.row - tableDataWork.count]
        }
        default:
            if indexPath.row < tableDataWork.count {
                title = tableDataWork[indexPath.row]
            } else {
                title = tableDataHome[indexPath.row + tableDataWork.count]
            }
    }
    cell?.textLabel?.text = title


    if cell != nil {
        return cell!
    }
    return UITableViewCell()
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // If
    switch dataFilter {
    case 0: return tableDataHome.count
    case 1: return tableDataWork.count
    default: return tableDataHome.count + tableDataWork.count
    }
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1;
}
@iAction func segmentedControlAction(发送方:AnyObject){
开关分段控制。选择分段索引{
案例0:
打印(“主页”)
数据过滤器=0
案例1:
印刷品(“作品”)
数据过滤器=1
案例2:
打印(“全部”)
数据过滤器=2
违约:
打印(“全部”)
数据过滤器=2
}
重新加载()
}
func reload(){
dispatch\u async(dispatch\u get\u main\u queue()){
self.tableView.reloadData()
}
}
func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
let cell=tableView.dequeueReusableCellWithIdentifier(“任务单元”)
变量标题:字符串?
开关数据过滤器{
案例0:
title=tableDataHome[indexPath.row]
案例1:
title=tableDataWork[indexPath.row]
案例2:
如果indexath.rowInt{
//如果
开关数据过滤器{
案例0:返回tableDataHome.count
案例1:返回tableDataWork.count
默认值:return tableDataHome.count+tableDataWork.count
}
}
func numberOfSectionsInTableView(tableView:UITableView)->Int{
返回1;
}

您可以在此处找到整个项目:

您应该筛选数据(数组等),然后重新加载表视图。我如何使用此.filter函数筛选类别字符串?我尝试过“categories.filter(“School”),但它给了我一个错误。如何使用它,以及什么是“抛出”?因此,过滤器函数接受查询,您需要为被查询的对象传递$0,以及属性和条件。例如,someArray.filter{$0.category=“School”}$0表示数组中的每个对象,这些对象将被检查其类别匹配是否不工作:(我想我需要放弃这个想法。也许唯一的方法是创建分区……我意识到即使它工作,单元格也会出现故障,我只想更改类别标签,但不更改任务标签,这样就可以显示其他单元格的任务,而不是它自己的任务。我会看一看,非常感谢!