目的
私はSwift 3.0とXcode 8.0でiPhoneアプリケーションを作っています。 テーブルビューコントローラーを使用して色を選択するための設定メニューを作成します。Swift 3.0のUITableViewControllerで新しいチェックマークを選択すると、デフォルトのチェックマークを削除するにはどうすればよいですか?
このメニューでは、1つのセル(色)だけを選択可能にします。 私は既にデフォルトの選択肢を "グリーン"に設定しました。最初に設定メニューを開くと、選択したセル(色)が緑色になります。しかし、ユーザーは新しいものを選ぶことができます。 (私はこの機能のためにUserDefaults
を使用しています。)
問題
私は新しいセルを選択すると、デフォルトのセルが消えません。 新しいセルを選択すると、このデフォルトの選択肢を削除します。 (私は他のものはOKだと思います。E. gの。委譲し、ユーザデフォルト)
私の考え
私はdidSelectRowAt
方法で何かを書く必要があると思います。 新しいチェックマークを選択する前にすべてのチェックマークを削除する必要があるかもしれません。 私は以下のソースにコメントを書きました。
// TableViewControllerColorDetail.swift
import UIKit
class TableViewControllerColorDetail: UITableViewController {
var colors = ["Purple", "White", "Blue", "Green", "Orange", "Yellow", "Red", "Black", "Pink", "Aqua", "Lapis lazuli"]
var colorname = ""
let userDefaults = UserDefaults.standard
override func viewDidLoad() {
super.viewDidLoad()
tableView.allowsMultipleSelection = false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return colors.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ColorsDetail", for: indexPath)
// Configure the cell...
cell.textLabel!.text = colors[indexPath.row]
cell.textLabel?.textColor = UIColor.white
cell.selectionStyle = UITableViewCellSelectionStyle.none
let savedcolornumber = userDefaults.object(forKey: "MemoryOfColornumber")
let colornumber = indexPath.row
//If user don’t have save data, user is using this App at first time, check to 3rd cell
if savedcolornumber == nil {
print("No Save Data")
if (indexPath.row == 3) {
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
//If user have save dete
} else {
print("User have a Save Data")
//Check to Save Color
if (colornumber == savedcolornumber as! Int) {
print("It is same as saved color")
cell.accessoryType = .checkmark
} else {
print("It is NOT same as saved color")
cell.accessoryType = .none
}
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at:indexPath)
// (Expect) Delete checkmarks in all cells
// ???????
// Check to selected cell
cell?.accessoryType = .checkmark
// Receive the text from selected cell
let colorname = colors[indexPath.row]
let colornumber = indexPath.row
// Save with the key
// Reload
userDefaults.set(colornumber, forKey: "MemoryOfColornumber")
userDefaults.set(colorname, forKey: "MemoryOfColorname")
userDefaults.synchronize()
// Export to AppDelegate
let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.message = colorname
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at:indexPath)
// Delete Checkmark
cell?.accessoryType = .none
}
/*
// Override to support conditional editing of the table view.
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
*/
/*
// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// Delete the row from the data source
tableView.deleteRows(at: [indexPath], with: .fade)
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
*/
/*
// Override to support rearranging the table view.
override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {
}
*/
/*
// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable.
return true
}
*/
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
選択したセルの配列を維持します。 – vaibhav
は2つのindexPathを維持します。 1つは現在のもの、もう1つは最後のものです。セルをクリックするたびに、そのセルと最後にクリックされたセルを更新する必要があります。このように、あなたのテーブルビューは、セルがビンクリックされるたびに常に2つのセルを更新します。 –
コメントありがとうございます。私は[真実、真実、真実]のような別の配列を準備する方法を探しました。私はそれがチェックマークを切り替える主要な方法だと思います。しかし、それは私のために複雑です...私はそれを理解しようとしています。 – Dan