2017-08-04 11 views
1

目的

私はSwift 3.0とXcode 8.0でiPhoneアプリケーションを作っています。 テーブルビューコントローラーを使用して色を選択するための設定メニューを作成します。Swift 3.0のUITableViewControllerで新しいチェックマークを選択すると、デフォルトのチェックマークを削除するにはどうすればよいですか?

このメニューでは、1つのセル(色)だけを選択可能にします。 私は既にデフォルトの選択肢を "グリーン"に設定しました。最初に設定メニューを開くと、選択したセル(色)が緑色になります。しかし、ユーザーは新しいものを選ぶことができます。 (私はこの機能のためにUserDefaultsを使用しています。)

問題

私は新しいセルを選択すると、デフォルトのセルが消えません。 新しいセルを選択すると、このデフォルトの選択肢を削除します。 (私は他のものはOKだと思います。E. gの。委譲し、ユーザデフォルト)

私の考え

私はdidSelectRowAt方法で何かを書く必要があると思います。 新しいチェックマークを選択する前にすべてのチェックマークを削除する必要があるかもしれません。 私は以下のソースにコメントを書きました。

default selection in table view

// 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. 
} 
    */ 

} 
+0

選択したセルの配列を維持します。 – vaibhav

+0

は2つのindexPathを維持します。 1つは現在のもの、もう1つは最後のものです。セルをクリックするたびに、そのセルと最後にクリックされたセルを更新する必要があります。このように、あなたのテーブルビューは、セルがビンクリックされるたびに常に2つのセルを更新します。 –

+0

コメントありがとうございます。私は[真実、真実、真実]のような別の配列を準備する方法を探しました。私はそれがチェックマークを切り替える主要な方法だと思います。しかし、それは私のために複雑です...私はそれを理解しようとしています。 – Dan

答えて

0

以前にチェックしたindexPathを保存しない場合は、以下のようにすべての行でも確認できます。これをdidSelectRowAtに入れます。indexPath

for row in 0..<tableView.numberOfRows(inSection: indexPath.section) { 
    if let cell = tableView.cellForRow(at: IndexPath(row: row, section: indexPath.section)) { 
     cell.accessoryType = row == indexPath.row ? .checkmark : .none 
    } 
} 
+1

ご意見ありがとうございます。私はこのコードを書いた。私は、チェックマークを削除することができます。 – Dan

+0

うん。ハッピーコーディング –

3

選択したセルのインデックスパスを格納しdidSelectRowAtにそのチェックマークアクセサリを削除する必要があります。

var selectedIndexPath: IndexPath! 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let cell = tableView.cellForRow(at: indexPath) 

    // Delete checkmarks in the previously selected cell 
    if indexPath != nil, 
     indexPath != selectedIndexPath, 
     selectedCell = tableView.cellForRow(at: selectedIndexPath) { 
     selectedCell.accessoryType = .none 
     selectedIndexPath = indexPath 
    } 

    // Check to selected cell 
    cell?.accessoryType = .checkmark 
} 
+0

コメントありがとうございました。私はこのコードを書き、いくつかカスタマイズしようとしました。しかし、私はチェックマークを削除することができませんでした。 – Dan

関連する問題