如何使用Swift中的UISegmentedControl过滤表格视图单元格?

时间:2016-03-12 15:14:01

标签: swift uitableview swift2 uisegmentedcontrol

我在问这个问题之前已经搜过了这个问题,但我找不到我需要的东西。

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

我想在表格视图的顶部放置一个UISegmentedControl:

全部 - 学校 - 主页 - 朋友

如果选择all,则会显示所有没有过滤的单元格。如果没有,它将显示具有相应类别的单元格。

我已经读过我需要为每个类别创建表视图部分,但这会改变我的代码很多,我甚至不知道如何使用多个表视图部分,我已经尝试了一次,但它不断重复第二节中一节的细胞。

那么如何过滤每个类别的细胞?

我可以举个例子吗? :

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" {

            }
    }

我只是不知道从哪里开始。如何识别和隐藏细胞?

2 个答案:

答案 0 :(得分:2)

在我看来,您可能希望先采用更简单的方法,然后开始工作。设置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;
}

您可以在此处找到整个项目:https://github.com/ryantxr/segmented-control-app

答案 1 :(得分:1)

这取决于你的桌面视图。

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

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

中使用已过滤的数据源作为数据源