발표해야 나는 또한 updateCurrentValue
로 업데이트 UILabel
모든 숫자의 값을 얻을, 나는 999 int
의 같은 번호 (000 ~ 999)를 한 그들은 모두 UILabel
에 인쇄되어 있습니다 나는 발표 function
을 수행하는 UIButton
을 누르면, 수 (15) (예를 들어) 발표에 대한 AVFoundation
하고 코드를 통해 각을 가져 숫자의 소리 것은 :스위프트 : 멀티 기능 문제
if currentValue == 15 {
Sound15?.play()
}
내가 코드를 찾고 있어요 그 왜냐하면 999 개의 숫자 모두에 대해 function
을 만드는 것은 시간 낭비 일 것이기 때문입니다. 어떤 방법으로도 value
만 제공 할 수 있으며 나머지 숫자는 자동으로 func
을 찾습니다. 나는 누군가가 대답 할 수 있도록 충분히 분명하게 할 수 있기를 바란다. 여기에 내가 지금까지 가지고있는 것이 있습니다 :
import UIKit
import AVFoundation
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
var Sound1:AVAudioPlayer?
var Sound2:AVAudioPlayer?
var Sound3:AVAudioPlayer?
var Sound4:AVAudioPlayer?
var Sound5:AVAudioPlayer?
var Sound6:AVAudioPlayer?
var Sound7:AVAudioPlayer?
var Sound8:AVAudioPlayer?
var Sound9:AVAudioPlayer?
var Sound10:AVAudioPlayer?
var Sound11:AVAudioPlayer?
var Sound12:AVAudioPlayer?
var Sound13:AVAudioPlayer?
var Sound14:AVAudioPlayer?
var Sound15:AVAudioPlayer?
var Sound16:AVAudioPlayer?
var Sound17:AVAudioPlayer?
var Sound18:AVAudioPlayer?
var Sound19:AVAudioPlayer?
var Sound20:AVAudioPlayer?
var Sound30:AVAudioPlayer?
var Sound40:AVAudioPlayer?
var Sound50:AVAudioPlayer?
var Sound60:AVAudioPlayer?
var Sound70:AVAudioPlayer?
var Sound80:AVAudioPlayer?
var Sound90:AVAudioPlayer?
var Sound100:AVAudioPlayer?
var Sound200:AVAudioPlayer?
var Sound300:AVAudioPlayer?
var Sound400:AVAudioPlayer?
var Sound500:AVAudioPlayer?
var Sound600:AVAudioPlayer?
var Sound700:AVAudioPlayer?
var Sound800:AVAudioPlayer?
var Sound900:AVAudioPlayer?
var currentValue = 0
func updateCurrentValue() {
let hundreds = max(0, pickerView.selectedRow(inComponent: 0))
let tens = max(0, pickerView.selectedRow(inComponent: 1))
let ones = max(0, pickerView.selectedRow(inComponent: 2))
currentValue = hundreds * 100 + tens * 10 + ones
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 3
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return String(row)
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return 10 // digits 0 - 9
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
updateCurrentValue()
changeLabelText()
}
//Some Functions as example of how it works:
private func accouncingNumbers() {
//for single digit
if currentValue == 1 {
Sound1?.play()
}
//for double digits
if currentValue == 24 {
Sound20?.play()
SoundTimer = Timer.scheduledTimer(withTimeInterval: 1.2, repeats: false) {timer in
self.Sound4?.play()
self.SoundTimer?.invalidate()
self.SoundTimer = nil
}
}
//for 3-digits
if currentValue == 146 {
Sound100?.play()
SoundTimer = Timer.scheduledTimer(withTimeInterval: 1.2, repeats: false) {timer in
self.Sound40?.play()
self.SoundTimer?.invalidate()
self.SoundTimer = nil
self.SoundTimer = Timer.scheduledTimer(withTimeInterval: 1.2, repeats: false) {timer in
self.Sound6?.play()
self.SoundTimer?.invalidate()
self.SoundTimer = nil
}
}
}
//Sounds imported here
do
{
let audioURL1 = Bundle.main.url(forResource: "1", withExtension: "mp3")!
Sound1 = try AVAudioPlayer(contentsOf: audioURL1)
Sound1?.prepareToPlay()
}
catch
{
print(error)
}
}
이 과정에서 더 쉽고 간단한 방법을 찾으려고합니다.
func verbalizeValue(_ value: Int) {
let announcements = prepareAnnouncements(value)
playAnnouncements(announcements)
}
func prepareAnnouncements(_ value: Int) -> [String] {
var valueToProcess: Int = value
var announcements: [String] = []
if valueToProcess >= 100 {
// values 100 and above
let hundred = valueToProcess/100
valueToProcess = valueToProcess % 100
let soundfile = "say_\(hundred)00.wav"
announcements.append(soundfile)
}
if valueToProcess >= 20 {
// values 30 to 99
let dozen = valueToProcess/10
valueToProcess = valueToProcess % 10
let soundfile = "say_\(dozen)0.wav"
announcements.append(soundfile)
}
if valueToProcess > 1 || announcements.count == 0 {
// values 0 to 19
let soundfile = "say_\(value).wav"
announcements.append(soundfile)
}
return announcements
}
func playAnnouncements(_ announcements: [String]) {
// announcements contains an array of wave filenames to play one after the other
}
그런 다음 당신이 다시로드 하나의 AVAudioPlayer을 사용할 수 있습니다 : 당신이 당신의 응용 프로그램에 번들 할 필요가 사운드 파일의 양을 최소화하기 위해
왜 오디오 플레이어가 2 대 이상입니까? – rmaddy
오디오 플레이어가 생성되고 설정되는 방법을 보여주는 코드를 업데이트하여 수행중인 작업을 볼 수 있습니다. – rmaddy
이 방금 코드를 업데이트했습니다. @rmaddy – Shahin