Отображение неверных данных после прокрутки TableView - PullRequest
0 голосов
/ 28 декабря 2018

Я пытался обновить ячейку TableView при нажатии на ячейку из CollectionView с ключевым словом класса.Например, когда я нажимаю «все», он должен выполнять все данные.Когда я нажимаю «а», он должен выполнять класс с «а».Похоже, все идеально, пока я не прокрутите вниз TableView.Все данные, которые не являются моими намерениями, должны показывать только указанные данные, даже прокручивая вверх / вниз TableView.Это связано с проблемой dequeueReusableCell?

Я использую FMDB для запроса данных при нажатии на ячейку CollectionView.Я прилагаю gif

enter image description here

и надеюсь, что может быть лучше понять мою проблему.

Может кто-нибудь помочь мне с этим, пожалуйста?Спасибо.

добавьте сюда функцию cellForRow.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! ListTableViewCell

    if navigationItem.searchController?.isActive == true{
        cell.itemImage.image = searchArray[indexPath.row].thumbnailImage()
        cell.nameLBL.text = "name:\(searchArray[indexPath.row].name ?? "")"
        cell.quantityLBL.text = "Qty:\(searchArray[indexPath.row].quantity ?? 0)pcs"
        cell.amountLBL.text = "amount:\(searchArray[indexPath.row].amount ?? 0)"
        cell.dateLBL.text = "date:\(searchArray[indexPath.row].date ?? "")"
        cell.storeLBL.text = "store:\(searchArray[indexPath.row].store ?? "")"
        cell.classLBL.text = "class:\(searchArray[indexPath.row].itemClass ?? "")"
        if let reminder = searchArray[indexPath.row].reminder {
            let reminderText = ""
            cell.reminderLBL.text = "\(reminder)" + reminderText
            reminderStatus = true
        }else{
            cell.reminderLBL.text = "reminder:NO"
            if self.array[indexPath.row].reminder == nil{
                cell.reminderLBL.text = "reminder:NO"
            }
            reminderStatus = false
        }

    }else{

        cell.itemImage.image = array[indexPath.row].thumbnailImage()
        cell.nameLBL.text = "name:\(array[indexPath.row].name ?? "")"
        cell.quantityLBL.text = "Qty:\(array[indexPath.row].quantity ?? 0)pcs"
        cell.amountLBL.text = "amount:\(array[indexPath.row].amount ?? 0)"
        cell.dateLBL.text = "date:\(array[indexPath.row].date ?? "")"
        cell.storeLBL.text = "store:\(array[indexPath.row].store ?? "")"
        cell.classLBL.text = "class:\(array[indexPath.row].itemClass ?? "")"
        if let reminder = array[indexPath.row].reminder {
            let reminderText = ""
            cell.reminderLBL.text = "\(reminder)" + reminderText
            reminderStatus = true
        }else{
            cell.reminderLBL.text = "reminder:NO"
            if self.array[indexPath.row].reminder == nil{
                cell.reminderLBL.text = "reminder:NO"
            }
            reminderStatus = false
        }
        print(array.count)
    }
    return cell
}

добавьте сюда функцию didSelectItemAt. * ​​1021 *

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    switch indexPath.row {
    case 0:
        reloadTableViewAndDatabase()
    case 1:
       reloadTableViewAndDatabase(itemClass: searchStringOfDaily)
    case 2:
       reloadTableViewAndDatabase(itemClass: searchStringOfCare)
    case 3:
        reloadTableViewAndDatabase(itemClass: searchStringOfCosmetic)
    default:
        reloadTableViewAndDatabase()
    }
}

И функцию, которая может быть фактором.

let searchStringOfDaily = "SELECT * FROM Data where itemClass = 'a';"
let searchStringOfCare = "SELECT * FROM Data where itemClass = 'b';"
let searchStringOfCosmetic = "SELECT * FROM Data where itemClass = 'c';"

func reloadTableViewAndDatabase()
{
    self.dbHelper.searchAllDataFromDatabase { (dataArray) in
        self.array = dataArray
        DispatchQueue.main.async {
         self.tableView.reloadData()
        }
    }
}

func reloadTableViewAndDatabase(itemClass:String)
{
    self.dbHelper.searchDataFromDatabase(completionHandler: { (dataArray) in
        self.array = dataArray
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }, search: itemClass)
}



public func searchDataFromDatabase(completionHandler:([Data]) -> (),search:String) {

    var searchResultArray:[Data] = []
    if self.database == nil{
        self.database = FMDatabase(path: self.databasePath)
    }
    if self.database.open(){
        let searchString = search
        do{
            let resultNext = try self.database.executeQuery(searchString, values: nil)
            while resultNext.next(){
                let dataName = resultNext.string(forColumn: "name")
                let dataQuantity = resultNext.int(forColumn: "quantity")
                let dataAmount = resultNext.int(forColumn: "amount")
                let dataDate = resultNext.string(forColumn: "date")
                let dataStore = resultNext.string(forColumn: "store")
                let dataImageName = resultNext.string(forColumn: "imageName")
                let dataItemClass = resultNext.string(forColumn: "itemClass")
                let dataReminder = resultNext.string(forColumn: "reminder")

                let data = Data(name: dataName!, quantity: Int(dataQuantity), amount: Int(dataAmount), date: dataDate!, store: dataStore!, imageName: dataImageName ?? "", reminder: Int(dataReminder!), itemClass: dataItemClass!)
                searchResultArray.append(data)
            }
            print("query success")
        }catch{
            print(error.localizedDescription)
        }
        self.database.close()
    }
    completionHandler(searchResultArray)
}
...