2017-08-24 8 views
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 
} 
+0

を実行するかを判断しようとしているように、それは私には見えますセルインデックスパスを検査することによりチェックボックスの状態。これはおそらく、セルが非同期にキューに入れられ、デキューされるときに破損する原因になります。チェックした状態をデータソースに保存し、セルが表示されたらチェックマークを更新してみてください。 – brandonscript

+0

おそらく関連していないかもしれませんが、**決してあなたが 'did'、' will'、 'should'を含むデリゲートメソッドを呼び出すことは決してありません。 'deselectRow(at:animated:' – vadian

+0

あなたの迅速な対応に感謝します!私はかなりiOSに新しく、データソースにチェックされた状態を格納することによって何を意味するのかよく分かりません。 – DannyBoi8181

答えて

1

選択解除アクションは一見didSelectRowAt

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     tableView .deselectRow(at: indexPath, animated: false) 

} 
関連する問題