如何在搜索后打勾 [英] How to put a checkmark after search

查看:46
本文介绍了如何在搜索后打勾的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆