2017-06-29 14 views
0

ユーザーは最大1つの声を選択できます。チェックマークがタップした場所にジャンプし、もう一方を選択解除します。SwiftのTableViewで最大1つのチェックマーク

非常にシンプルなようですが、私は解決策を見ません。そして私はインターネット上で答えを見つけることができません。

どうかお手伝いできますか?

ありがとうございます!

import UIKit 
import AVFoundation 

class voicesTableViewController: UITableViewController { 

    fileprivate let synthesizer = AVSpeechSynthesizer() 
    fileprivate var speechVoices = AVSpeechSynthesisVoice.speechVoices() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 


    // MARK: - Table view data source 

    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 speechVoices.count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

     //Name 
     let voice = speechVoices[indexPath.row] 
     let voiceLang = voice.language as? String 
     let theVoice = UserDefaults.standard.object(forKey:"voice") as? String 

     cell.textLabel?.text = voice.name 


     // Language 
     if let language = countryName(countryCode: voice.language) { 
      cell.detailTextLabel?.text = "\(language)" 
     } 
     else { 
      cell.detailTextLabel?.text = "" 
     } 

     cell.detailTextLabel?.textColor = UIColor.gray 

     // Checkmark 

     if (theVoice != nil) { 
      if(theVoice == voiceLang) { 
       cell.accessoryType = UITableViewCellAccessoryType.checkmark 
      } 
     } 


     return cell 
    } 

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

     let voice = speechVoices[indexPath.row] 

     if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark { 
      tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none 
     } 
     else 
     { 
      //if ((tableView.indexPathsForSelectedRows?.count)! > 1) { 
       tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark 
      //} 
     } 

     UserDefaults.standard.set(voice.language, forKey:"voice") 
     UserDefaults.standard.synchronize() 


     tableView.deselectRow(at: indexPath, animated: true) 
    } 

    func countryName(countryCode: String) -> String? { 
     let preferredLanguage = NSLocale.preferredLanguages[0] as String 
     let current = Locale(identifier: preferredLanguage) 
     return current.localizedString(forLanguageCode: countryCode) ?? nil 

     //return current.localizedString(forIdentifier: indentifier) ? nil 
    } 


} 
機能 cellForRow:atIndexPath

答えて

1

簡単な変更作業をする必要があります:プロパティfileprivate var selectedIndexPath: IndexPath?

2)変更機能を追加 1):

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    //Name 
    let voice = speechVoices[indexPath.row] 
    let voiceLang = voice.language as? String 
    let theVoice = UserDefaults.standard.object(forKey:"voice") as? String 

    cell.textLabel?.text = voice.name 


    // Language 
    if let language = countryName(countryCode: voice.language) { 
     cell.detailTextLabel?.text = "\(language)" 
    } 
    else { 
     cell.detailTextLabel?.text = "" 
    } 

    cell.detailTextLabel?.textColor = UIColor.gray 

    // Checkmark 

    if(theVoice != nil && theVoice == voiceLang) { 
     cell.accessoryType = .checkmark 
    } else { 
     cell.accessoryType = .none 
    } 

    return cell 
} 

UPD#1

をしかし、あなたはより良いソリューションを使用することができますfunc tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)から次のものへ:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

     //Name 
     let voice = speechVoices[indexPath.row] 
     let voiceLang = voice.language as? String 
     let theVoice = UserDefaults.standard.object(forKey:"voice") as? String 

     cell.textLabel?.text = voice.name 


     // Language 
     if let language = countryName(countryCode: voice.language) { 
      cell.detailTextLabel?.text = "\(language)" 
     } 
     else { 
      cell.detailTextLabel?.text = "" 
     } 

     cell.detailTextLabel?.textColor = UIColor.gray 

     // Checkmark 
     cell.accessoryType = self.selectedIndexPath == indexPath ? .checkmark : .none 
     return cell 
    } 

3)そしてfunc tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)に、あなたは次のことが可能です。

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

     let voice = speechVoices[indexPath.row] 

     self.selectedIndexPath = indexPath 
     UserDefaults.standard.set(voice.language, forKey:"voice") 
     UserDefaults.standard.synchronize() 


     tableView.deselectRow(at: indexPath, animated: true) 
     tableView.reloadRows(at: [indexPath], with: .automatic) 
    } 
+0

また 'tableView.reloadData()' 'didSelect'の終わりに。 – Slayter

+0

はい、ありがとうございます! –

関連する問題