从单个数组创建嵌套数组

时间:2017-11-13 11:04:56

标签: ios arrays swift

我的应用中有一个搜索功能,可以从 fetchedResultsController 获取数据。问题是当我在 tableView 中显示过滤后的数据时,每次到达新的部分时,数组都会反复开始(由于 indexPath.row 每次都为0 < strong> indexPath.section 递增)。我从来没有擅长嵌套数组,我认为这是学习它们的最佳时机,因为没有这个数组我就无法克服我的问题。

所以我有这个数组,它是 fetchedResultsController 中的过滤数据:

filteredItems = (fetchedResultsController.fetchedObjects?.filter({(budget : Budget) -> Bool in
 return (budget.dataDescription?.lowercased().contains(searchText.lowercased()))!
        }))!

如何创建一个名为filteredObjects的数组,用于对部分的项目进行排序?例如

- 第1节(filteredObjects [0]):

  • 第1项(filteredObjects [0] [1])
  • 第2项(filteredObjects [0] [2])

-

第2节(filteredObjects [1]):

  • 第1项(filteredObjects [1] [0]) 等

2 个答案:

答案 0 :(得分:1)

使用以下方法定义部分数量

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return filteredObjects.count
}

并且,对于行数

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredObjects[section].count
    }

最后,对于CellForRowAtIndexpath

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            var cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TaskTableViewCell
    let currentItem = filteredObjects[indexPath.section][indexPath.row]

    ... Here, use currentItem as whatever it is (Object or dictionary)

            return cell
}

答案 1 :(得分:0)

    let budgets = [Budget]()
    let searchResult = [Budget]()

您应该始终在tableview数据源方法中使用searchResult数组。最初你应该将所有预算数组对象添加到searchResult&amp;加载表视图。

搜索开始时从searchResult中删除所有项目,并将过滤后的结果添加到搜索结果数组&amp;重新加载tableview。

    func search(searchText:String){
        searchResult.removeAll()
        let result = budgets.filter({
            var budget = $0
            let filtered = budget.expenses.filter({
                if let deptName = $0.deptName{
                    return deptName.lowercased().contains(searchText.lowercased())
                }
                return false
            })
            budget.expenses = filtered
            return budget.expenses.count != 0
        })

        searchResult.append(contentsOf: result)
    }

struct Budget {
    var expenses = [Expense]()
 }

 struct Expense{
    var deptName:String?
 }