UISwitch в строке таблицы - PullRequest
       11

UISwitch в строке таблицы

0 голосов
/ 06 октября 2018

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

Ячейка:

var switchHandler: ((Bool)->Void)?

@IBAction func switchChanged(_ sender: UISwitch) {
    self.switchHandler?(sender.isOn)
}

Просмотр контроллера:

var selectedCells = Set<IndexPath>()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as? SmsTableViewCell

    cell?.PhonNumberLbl.text = data![indexPath.section].contacts[indexPath.row]?.phoneNumber
    cell?.NameLbl.text = data![indexPath.section].contacts[indexPath.row]?.name
    cell?.selectedTF.isOn = (data![indexPath.section].contacts[indexPath.row]?.selected)!

    cell?.selectedTF.isOn = self.selectedCells.contains(indexPath)
    cell?.switchHandler = { (switchState) in
        if switchState {
            self.selectedCells.insert(indexPath)
        } else {
            self.selectedCells.remove(indexPath)
        }
    }

    return cell!
}

Модель:

typealias smsModelList = [SmsModel]

struct SmsModel:Codable {
    var unitNo:Int?
    var unitPlaque:String?
    var billText:String?
    var contacts:[ContactsModel?]
}

typealias contactlistmodel = [ContactsModel]

struct ContactsModel:Codable
{
    var id :Int?
    var selected :Bool?
    var phoneNumber : String?
    var name : String?
}

ДелаетКто-нибудь видит что-то не так, что выключает выключатель?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Прежде всего, если вы все равно принудительно развернете ячейку, сделайте это в строке dequeue, чтобы избежать ненужного количества вопросительных знаков, и используйте API для возврата необязательной ячейки

let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell", for: IndexPath) as! SmsTableViewCell

.исправьте проблему, обновите свойство selected структуры ContactsModel напрямую и забудьте о дополнительном массиве selectedCells.Далее объявляем - по крайней мере - selected как необязательные, практически нет состояния возможно .И объявить также все массивы источников данных (data / contacts) как необязательные, cellForRow вызывается только в том случае, если по умолчанию имеется элемент в определенном indexPath.

struct ContactsModel : Codable {
   ...
   var selected : Bool
   ...
}

...

let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell", for: IndexPath) as! SmsTableViewCell
let contact = data[indexPath.section].contacts[indexPath.row]
cell.PhonNumberLbl.text = contact.phoneNumber
cell.NameLbl.text = contact.name
cell.selectedTF.isOn = contact.selected

cell.switchHandler = { [unowned self] switchState in
    // as the structs are value types you have to specify the full reference to the data source array
    self.data[indexPath.section].contacts[indexPath.row].selected = switchState
}

в этом случае используйте классы, а не структуры, тогда вы можете сократить замыкание

cell.switchHandler = { switchState in
    contact.selected = switchState
}
0 голосов
/ 06 октября 2018

Вы используете оба параметра

cell?.selectedTF.isOn = (data![indexPath.section].contacts[indexPath.row]?.selected)! 
cell?.selectedTF.isOn = self.selectedCells.contains(indexPath)

, поэтому свойство коммутатора isOn контролируется с двух сторон, поэтому вы должны решить, какую линию следует соединить, плюс не зависеть от ячейки прототипа раскадровкиНастройка из-за повторного использования ячейки будет изменена, если вы хотите сделать их все по умолчанию, тогда измените var selectedCells, чтобы он содержал все возможные indexPaths, и прокомментируйте другой

...