gpt4 book ai didi

swift - 如何在搜索后打勾

转载 作者:行者123 更新时间:2023-11-30 10:36:23 26 4
gpt4 key购买 nike

我正在尝试在搜索后打勾。我在这里看到了一些答案,但它对我不起作用。我已经尝试了一些答案,但只会出错。

这是我编写的代码。

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()

我希望搜索后保留复选标记。所以至少我可以将所有选中的项目保存在某个地方。

最佳答案

你的代码非常非常非常复杂。完成您的请求的最有效方法是使用 isChecked结构中的信息,没有其他内容,没有额外的数组、字典、属性。

给结构体和 Bool 一个更有意义的名称。

struct Person {
let name: String
var isChecked: Bool
}

在 Controller 中命名数据源数组people和过滤器数组 filteredPeople 。此外您只需​​要isSearching ,删除所有其他属性

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强制打开自定义单元格并将其命名为大写(好的做法)。通过nameconfigureCell并根据 isChecked 的值设置附件 View

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 数组)并重新加载该行,仅此而已

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()
}

this answer我已经建议了一个更有效的版本 textDidChange ,请考虑遵循建议。

要让被检查的人只需编写

let checkedPeople = people.filter{$0.isChecked}

关于swift - 如何在搜索后打勾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57907282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com