Swift中TableView中的最大一个复选标记

时间:2017-06-29 20:08:21

标签: swift uitableview

我希望用户可以选择最多一个语音。并且勾选标记会跳到您敲击并取消选择另一个的位置。

看起来很简单,但我没有看到解决方案。我无法在互联网上找到答案。

请有人帮帮我吗?

谢谢你!

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
    }


}

1 个答案:

答案 0 :(得分:1)

功能cellForRow:atIndexPath的简单更改应该有效:

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

但是你可以使用更好的解决方案: 1)添加属性fileprivate var selectedIndexPath: IndexPath?

2)将函数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)
    }