【问题标题】:How to filter item from NSObject Array如何从 NSObject 数组中过滤项目
【发布时间】:2019-04-29 11:29:02
【问题描述】:

下面是我的 2 个对象

肌肉

struct MuscleListObject {
    var strMuscleName: String = ""
    var arrMuscleExercise: [MuscleExerciseListObject] = []
}

ExerciseObject

struct MuscleExerciseListObject {
    var strExerciseName: String  = ""
}

我知道 Muscle wise 过滤器,但我想明智地搜索项目锻炼。我怎样才能做到这一点?请指导我。

arrSearchedMuscle = self.arrExercise.filter({ objMuscle in
    if let name = objMuscle.strMuscleName as? String, let query = searchBar.text {
        return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil
    }
    return false
})

编辑

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchText.count == 0 {
            isSearching = false
            arrSearchedMuscle = arrExercise
        }
        else {
            isSearching = true

            let query = searchText
            arrSearchedMuscle = arrExercise.compactMap { category -> MuscleListObject? in
                if category.strMuscleName.range(of: query, options: [.caseInsensitive]) != nil {
                    return category
                } else {
                    arrSearchedExercise = category.arrMuscleExercise.filter({ $0.strExerciseName.range(of: query, options: [.caseInsensitive]) != nil  })
                    if arrSearchedExercise.isEmpty {
                        return nil
                    } else {
                        let newCategory = category
                        newCategory.arrMuscleExercise = arrSearchedExercise
                        return newCategory
                    }
                }
            }
            print(arrExercise)
            print(arrSearchedMuscle)
        }
        self.tblVWExercise.reloadData()
    }

请指导我有关过滤器调用的信息。 提前致谢

【问题讨论】:

  • 不要使用类。使用结构
  • @RajeshKumarR,已更新

标签: swift uitableview filter uisearchbar


【解决方案1】:

如果 Muscle 标题包含搜索查询,则返回整个 Muscle 对象。如果不使用搜索查询过滤运动对象并返回更新的肌肉对象。如果特定 Muscle 对象不包含搜索查询,则返回 nil

let query = "band"
arrSearchedMuscle = arrExercise.compactMap { category -> MuscleListObject? in
    if category.strMuscleName.range(of: query, options: [.caseInsensitive]) != nil {
        return category
    } else {
        let filteredItems = category.arrMuscleExercise.filter({ $0.strExerciseName.range(of: query, options: [.caseInsensitive]) != nil  })
        if filteredItems.isEmpty {
            return nil
        } else {
            var newCategory = category
            newCategory.arrMuscleExercise = filteredItems
            return newCategory
        }
    }
}
print(arrExercise)
print(arrSearchedMuscle)

【讨论】:

  • 这段代码工作正常,但是当我搜索某些内容时,结果很好,但是当我删除最后一个字符时,我的主数组中缺少一些项目arrExercise
  • 当 searchBar.text 为空时 arrSearchedMuscle = arrExercise
  • 我已经尝试过了,但在删除最后一个字符时结果仍然不匹配。用我的 SearchBar 代表更新了我的问题。
  • @Kuldeep 你在 tableview 数据源方法中使用过 arrSearchedMuscle 吗?
  • 是的,我用过arrSearchedMuscle。我根据isSearching 标志加载不同的数据。如果用户搜索了任何内容,那么我从arrSearchedMuscle 加载数据,否则从arrExercise 加载数据。
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2018-07-20
  • 2020-01-13
  • 2014-07-11
相关资源
最近更新 更多