Как я могу обрабатывать кнопку контрольного списка даже после включения или отключения поиска для tableview - PullRequest
0 голосов
/ 13 июля 2020

Как обрабатывать действие кнопки выбора checkList даже после включения или выключения поиска.

При выполнении поиска и выбора первого индекса и пустого поиска выбирается первый индекс элемента по умолчанию.

Как можно Я обрабатываю элементы контрольного списка даже после включения или отключения поиска.

Ниже приведен код того, что я сделал.

   var itemListArray =  ["Australia", "Brazil", "Canada","China", "Germany", "India", "Malaysia", "Pakistan", "Russia", "South Africa", "United States of America"]

func configurationTagsCell (cell: LocationTableViewCell,
                            forRowAtIndexPath indexPath:NSIndexPath){

    if (isSearching){

        let searchTagArray = self.searchListArray[indexPath.row].map{
            (stringName) -> String in
            return String(stringName)
            }.joined(separator: "")
        cell.lbl_LocationName?.text = searchTagArray
        cell.btn_CheckList?.tag = indexPath.row

    }
    else {

        cell.lbl_LocationName?.text = self.itemListArray[indexPath.row]
        cell.btn_CheckList?.tag = indexPath.row

    }

    cell.btn_CheckList?.addTarget(self, action: #selector(checkMarkButtonClicked(sender:)), for: .touchUpInside)

}

@objc func checkMarkButtonClicked ( sender: UIButton) {
    print("button presed")

    print_SHLog(sender.tag)

    if sender.isSelected {
        sender.isSelected = false

    } else {
        sender.isSelected = true
    }

}

@objc func textFieldDidChange(_ textfield: UITextField) {

  locationModelView!.isSearching = txt_SearchLocation?.text!.count == 0 ?  false: true
    let filteredStrings = listItemArray.filter({(item: String) -> Bool in
        let stringMatch = item.lowercased().range(of: (textfield.text?.lowercased())!)
        return stringMatch != nil ? true : false
    })
    print(filteredStrings)
    locationModelView.searchListArray = filteredStrings

    if (filteredStrings as NSArray).count > 0
    {
        //Record found
        //MARK:- You can also print the result and can do any kind of work with them
    }
    else{

    }
    self.reloadTableData()

}

1 Ответ

0 голосов
/ 13 июля 2020

Есть несколько проблем с вашим подходом, но основная проблема заключается в следующем:

Ячейки табличного представления повторно используются . Вы не можете полагаться на состояние элемента ячейки, потому что, когда вы перезагружаете таблицу, эта ячейка больше не будет связана с тем же элементом в ваших данных.

В основном вам нужно создать data объект, который будет отслеживать «выбранное» состояние вашего списка. Вы можете начать вот так ...

Определите объект данных:

struct MyItem {
    var itemName: String = ""
    var isSelected: Bool = false
}

Когда вы загружаете свой контроллер представления, создайте массив этого объекта, и заполните его:

class ViewController: UIViewController {
    
    var itemsArray: [MyItem] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let itemListArray =  ["Australia", "Brazil", "Canada","China", "Germany", "India", "Malaysia", "Pakistan", "Russia", "South Africa", "United States of America"]
        
        itemListArray.forEach { s in
            itemsArray.append(MyItem(itemName: s, isSelected: false))
        }
        
    }

}

Теперь у вас есть массив из MyItem объектов, каждый из которых имеет «имя» из вашего списка и для каждого установлено значение «не выбран».

Когда вы измените состояние "selected", вы можете сделать что-то вроде этого:

@objc func checkMarkButtonClicked ( sender: UIButton) {
    print("button presed")
    
    //print_SHLog(sender.tag)

    // toggle the selected state of the button
    sender.isSelected.toggle()

    // update the selected state in your data array
    itemsArray[sender.tag].isSelected = sender.isSelected
}

Когда вы отображаете свои ячейки, вы будете делать что-то вроде этого:

cell.lbl_LocationName?.text = self.itemsArray[indexPath.row].itemName
cell.btn_CheckList?.isSelected = self.itemsArray[indexPath.row].isSelected
cell.btn_CheckList?.tag = indexPath.row
cell.btn_CheckList?.addTarget(self, action: #selector(checkMarkButtonClicked(sender:)), for: .touchUpInside)

Однако вы Мне действительно нужно отслеживать два массива данных - «полный» массив и «фильтрованный» массив. Конечно, «отфильтрованный» массив не может использовать indexPath.row напрямую, потому что вам нужно обновить свойство .isSelected вашего элемента в «полном» массиве, чтобы оно было там при изменении фильтра.

Это может помочь вам, но я бы посоветовал поискать и просмотреть некоторые примеры отслеживания изменений данных при использовании поля поиска для фильтрации данных и найти лучшие примеры того, как управлять кнопками в ячейках.

...