1
現在、ユーザーデフォルトから取得した結果に応じてビューが読み込まれるときに、セクション内のテーブルビューセルにチェックボックスが設定されたグループ化テーブルビューが設定されています。ユーザーがセクション内の別のセルをタップすると、他のセルのチェックボックスが消え、タップしたセルに新しいチェックボックスが表示されます。TableView didSelectRowAt IndexPathが呼び出されません
これは、異なるセルを最初にタップすると動作するようですが、3回の変更後にチェックボックスを2回タップして変更する必要があります。他のすべてのタップtableView(_ tableView:UITableView、didSelectRowAt indexPath:IndexPath)が呼び出されていないように見えます。事前に任意の助け
おかげで、以下のコード:
var selectedIndex: IndexPath? = nil
let usersettings = UserDefaults.standard
override func viewDidLoad() {
super.viewDidLoad()
settingsTableView.delegate = self
settingsTableView.dataSource = self
//Load current preferences from user defaults
spamNumbersSetting = usersettings.value(forKey: "spamNumbersSetting") as! Int
personalNumbersSetting = usersettings.value(forKey: "personalNumbersSetting") as! Int
settingsSaveButton.isEnabled = false
// Do any additional setup after loading the view.
}
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){
let header = view as! UITableViewHeaderFooterView
header.textLabel?.textColor = UIColor.white
}
func numberOfSections(in tableView: UITableView) -> Int {
return settingsHeaders.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return settingsHeaders[section]
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return settingsContent[section].count
}
func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell {
let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
//Preset ticks depending on value of user settings
if indexPath.section == 0 {
if (spamNumbersSetting == 1) {
if indexPath.row == 0 {
cell.accessoryType = UITableViewCellAccessoryType.checkmark
selectedIndex = indexPath
}
} else {
if indexPath.row == 1 {
cell.accessoryType = UITableViewCellAccessoryType.checkmark
selectedIndex = indexPath
}
}
}
if indexPath.section == 1 {
if (personalNumbersSetting == 1){
cell.accessoryType = UITableViewCellAccessoryType.checkmark
}
}
cell.textLabel?.textColor = UIColor.white
let section = indexPath.section
cell.textLabel?.text = settingsContent[section][indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.tableView(tableView, didDeselectRowAt: selectedIndex!)
settingsSaveButton.isEnabled = true
let newCell = tableView.cellForRow(at: indexPath)
print("\(newCell?.textLabel?.text) is now the active cell !")
let oldCell = tableView.cellForRow(at: selectedIndex!)
//Deselect old cell
if indexPath.section == 0 {
if newCell?.accessoryType != .checkmark {
newCell?.accessoryType = .checkmark
//oldCell?.accessoryType = .none
} else {
newCell?.accessoryType = .none
}
selectedIndex = indexPath
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
print("Deselected \(cell?.textLabel?.text) !")
cell?.accessoryType = .none
}
を実行するかを判断しようとしているように、それは私には見えますセルインデックスパスを検査することによりチェックボックスの状態。これはおそらく、セルが非同期にキューに入れられ、デキューされるときに破損する原因になります。チェックした状態をデータソースに保存し、セルが表示されたらチェックマークを更新してみてください。 – brandonscript
おそらく関連していないかもしれませんが、**決してあなたが 'did'、' will'、 'should'を含むデリゲートメソッドを呼び出すことは決してありません。 'deselectRow(at:animated:' – vadian
あなたの迅速な対応に感謝します!私はかなりiOSに新しく、データソースにチェックされた状態を格納することによって何を意味するのかよく分かりません。 – DannyBoi8181