A general comment first. You could streamline your code by replacing statement like
Code Block | if unlocked.contains("Summer") { |
| } else { |
| unlocked.append("Summer") |
| } |
by
Code Block | if !unlocked.contains("Summer") { |
| unlocked.append("Summer") |
| } |
Which line do you get the crash exactly ? (code is slightly different from the snippet you present, so that makes it difficult to localise where this occurs); is it in didSelectRowAt ? Line 7, 10 or 16, 19 ?
If that's here:
i don't understand how you use names: rows in sections will be 0, 1, 2, restarting at zero in each section
you call self.unlocked[indexPath.row] ; Could you test with a print the size of self.unlocked and the number of rows in section ?
Code Block | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
| |
| print(indexPath.row) |
| tableView.deselectRow(at: indexPath, animated: true) |
|
| if indexPath.section == 0 { |
| let icon = self.unlocked[indexPath.row] |
| setIcon(name: icon) |
| if IconChange.setIconPurchased == true { |
| iconSelected = names[indexPath.row] |
| UserDefaults.standard.setValue(names[indexPath.row], forKey: "iconSelected") |
| IconSelector.reloadData() |
| tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark |
| } |
| } else if indexPath.section == 1 { |
| let icon = self.locked[indexPath.row] |
| setIcon(name: icon) |
| if IconChange.setIconPurchased == true { |
| iconSelected = names[indexPath.row] |
| UserDefaults.standard.setValue(names[indexPath.row], forKey: "iconSelected") |
| IconSelector.reloadData() |
| tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark |
| IconChange.pushBack = true |
| self.navigationController?.popViewController(animated: true) |
| } |
| } |
| } |
Yet another comment.
Maintaining several arrays to keep track of what is in tableView is really a risky design (the crash is just an illustration).
You'd better have a single dataSource, with attributes as locked: Bool instead of locked and unlocked arrays.