如何在搜索后打勾 [英] How to put a checkmark after search
问题描述
我尝试在搜索后打勾.我在这里看到了一些答案,但它对我不起作用.我已经尝试了一些答案,但只会出错.
Im trying to put checkmarks after doing a search. I've seen some answers here but it doesn't work for me. Ive tried some of the answers but it will only make an error.
这是我写的代码.
struct finalCheckednames { var name: String; var checkMark: Bool}
class ShowBroadcastNamesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
var nameslist = ["Mark","Chris", "James", "Sandra"]
var myIndex = 0
var nameArray = String()
var filteredData = [String]()
var isSearching = false
var selectedNamesToBroadcast = [String]()
var selectedNamesIndex:Int? = nil
var checkmarks = [Int : Bool]()
var hasChecked = Bool()
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? broadcastNamesTableViewCell {
let text: String!
if isSearching {
text = filteredData[indexPath.row]
} else {
text = nameslist[indexPath.row]
}
cell.configureCell(text: text)
if checkmarks[indexPath.row] != nil {
cell.accessoryType = checkmarks[indexPath.row]! ? .checkmark : .none
} else {
checkmarks[indexPath.row] = false
cell.accessoryType = .none
}
return cell
} else {
return UITableViewCell()
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if isSearching {
selectedNamesIndex = filteredData[indexPath.row] // im also getting an error here
} else {
selectedNamesIndex = indexPath.row
let cell = tableView.cellForRow(at: indexPath)
if let index = selectedNamesIndex {
if (cell?.accessoryType == .checkmark) {
cell!.accessoryType = .none
checkmarks[indexPath.row] = false
hasChecked = false
let indexPathTapped = tableView.indexPath(for: cell!)
let name = nameslist[(indexPathTapped!.row)]
print(name, hasChecked)
if let index = selectedNamesToBroadcast.index(of: name) {
selectedNamesToBroadcast.remove(at: index)
}
} else {
cell!.accessoryType = .checkmark
checkmarks[indexPath.row] = true
hasChecked = true
let indexPathTapped = tableView.indexPath(for: cell!)
let name = nameslist[(indexPathTapped!.row)]
print(name, hasChecked)
selectedNamesToBroadcast.append(name)
let selectedNamesToBroadcast = name
finalCheckednames(name: name, checkMark: hasChecked)
print(finalCheckednames.self, "XXXX")
}
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == nil || searchBar.text == "" {
isSearching = false
view.endEditing(true)
tableView.reloadData()
} else {
isSearching = true
filteredData = namelist.filter{$0.range(of: searchText, options: .caseInsensitive) != nil}
tableView.reloadData()
我希望在搜索后保留复选标记.所以至少我可以将所有勾选的项目保存在某处.
I was hoping for the checkmarks to stay after searching. So atleast i can save all the checkmarked items somewhere.
推荐答案
你的代码非常、非常、非常复杂.完成请求的最有效方法是使用结构中的 isChecked
信息,没有别的,没有额外的数组、字典、属性.
Your code is very, very, very complicated. The most efficient way to accomplish your request is to use the isChecked
information in the struct, nothing else, no extra arrays, dictionaries, properties.
给结构体和布尔一个更有意义的名字.
Give the struct and the Bool a more meaningful name.
struct Person {
let name: String
var isChecked: Bool
}
在控制器名称中,数据源数组people
和过滤器数组filteredPeople
.此外,您只需要isSearching
,删除所有其他属性
In the controller name the data source array people
and the filter array filteredPeople
. Further you need only isSearching
, delete all other properties
class ShowBroadcastNamesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
var people = [Person(name: "Mark", isChecked: false),
Person(name: "Chris", isChecked: false),
Person(name: "James", isChecked: false),
Person(name: "Sandra", isChecked: false)]
var filteredPeople = [Person]()
var isSearching = false
<打击>
var myIndex = 0
var nameArray = String()
var filteredData = [String]()
var selectedNamesToBroadcast = [String]()
var selectedNamesIndex:Int? = nil
var checkmarks = [Int : Bool]()
var hasChecked = Bool()
在 cellForRow
中强制展开自定义单元格并将其命名为大写(好的做法).将 name
传递给 configureCell
并根据 isChecked
In cellForRow
force unwrap the custom cell and name it uppercased (good practice). Pass the name
to configureCell
and set the accessory view depending on the value of isChecked
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! BroadcastNamesTableViewCell
let person = isSearching ? filteredPeople[indexPath.row] : people[indexPath.row]
cell.configureCell(text: person.name)
cell.accessoryType = person.isChecked ? .checkmark : .none
return cell
}
在 didSelectRow
中切换 isChecked
(如有必要,还更新 people
数组)并重新加载行,就这些
In didSelectRow
toggle isChecked
(and update also the people
array if necessary) and reload the row, that's all
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if isSearching {
filteredPeople[indexPath.row].isChecked.toggle()
let index = people.firstIndex{$0.name == filteredPeople[indexPath.row].name}!
people[index].isChecked.toggle()
} else {
people[indexPath.row].isChecked.toggle()
}
tableView.reloadRows(at: [indexPath], with: .automatic)
}
在textDidChange
中搜索名字
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
isSearching = false
filteredPeople.removeAll()
view.endEditing(true)
} else {
isSearching = true
filteredPeople = people.filter{$0.name.range(of: searchText, options: .caseInsensitive) != nil}
}
tableView.reloadData()
}
在 这个答案中 我已经推荐了一个更高效的 textDidChange
版本,请考虑遵循这些建议.
In this answer I already suggested a more efficient version of textDidChange
, please consider to follow the advices.
要得到被检查的人就写
let checkedPeople = people.filter{$0.isChecked}
这篇关于如何在搜索后打勾的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!