如何对AVSpeechSynthesisVoice.speechVoices()进行排序?

问题描述 投票:0回答:1

我是个初学者,在做这个的时候,我注意到选取器的视图没有排序

enter image description here

很明显中文不在土耳其语后面,那我该怎么整理呢?我看了好几个小时的代码,好像也想不出来怎么整理。这是我的完整代码。

谅谅

import AVFoundation
import UIKit

class SettingsView: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    @IBOutlet var pickerView: UIPickerView!

    var voicesArray: [String] = []
    let speechVoices = AVSpeechSynthesisVoice.speechVoices()

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView.delegate = self
        pickerView.dataSource = self
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return speechVoices.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        let language = Locale.current.localizedString(forLanguageCode: speechVoices[row].language)!
        let languageCode = speechVoices[row].language

        var regionCode:String = ""
        for region in Locale.isoRegionCodes {
            // Test if provided region codes has voices or not
            if languageCode.contains(region) {
                regionCode = region
            }
        }

        let country = Locale.current.localizedString(forRegionCode: String(regionCode))

        return "\(language) (\(country ?? ""))"
    }

    @IBAction func done(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
}

swift avfoundation uipickerview avspeechsynthesizer
1个回答
1
投票

中文(zh)肯定是在土耳其(tr)之后,所以这些看起来已经按地区代码排序了。如果你想按其他的东西排序(我假设它们在当地语言中的显示名称),那么你可以在为拾取器设置元素列表时对它们进行排序。例如

let speechVoices = AVSpeechSynthesisVoice.speechVoices().sorted(by: {
    Locale.current.localizedString(forLanguageCode: $0.language)! < Locale.current.localizedString(forLanguageCode: $1.language)!
})
© www.soinside.com 2019 - 2024. All rights reserved.