2017-09-18 1 views
0

UIPickerView에서 int을 읽으려고합니다. 이미 해봤지만 UILabel에만 인쇄되었습니다. 이번에는 각 번호마다 소리를 낼 수 있도록 데이터가 필요하므로 큐 아나운서를 만들 수 있습니다 (3 자리 숫자 UIPickerView이고 "001"에서 "999"까지 시작합니다.) 코드를 알지 못하는지 확인하십시오. 각 구성 요소의 선택한 번호가 사운드입니다 (이미 AVFoundation을 통해 사운드를 가져 왔지만 코드에 붙여 넣지는 않습니다). 그리고 주석에서 언급했듯이 변환은 내 문제가 아닙니다. . 여기에 새로운 내가 지금까지 가지고있는 것입니다.스위프트 : UIPickerVIew에서 읽기

import UIKit 
import AVFoundation 

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 
    //Picker View Settings 
    @IBOutlet weak var label: UILabel! 
    @IBOutlet weak var pickerView: UIPickerView! 

    let numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] 

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

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return numbers[row] 
    } 

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

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     let val1 = numbers[pickerView.selectedRow(inComponent: 0)] 
     let val2 = numbers[pickerView.selectedRow(inComponent: 1)] 
     let val3 = numbers[pickerView.selectedRow(inComponent: 2)] 

     label.text = "\(val1) \(val2) \(val3)" 
    } 

    //"Next" Button Setting 
    fileprivate func num(_ i: Int) -> Int { 
     return pickerView.selectedRow(inComponent: i) 
    } 

    @IBAction func buttonPressed() { 
     let currentNum = num(0) * 100 + num(1) * 10 + num(2) 
     let nextNum = currentNum + 1 

     pickerView.selectRow(nextNum % 1000/100, inComponent: 0, animated: true) 
     pickerView.selectRow(nextNum % 100/10, inComponent: 1, animated: true) 
     pickerView.selectRow(nextNum % 10, inComponent: 2, animated: true) 

     changeLabelText() 
    } 

    fileprivate func changeLabelText() { 
     label.text = "\(num(0)) \(num(1)) \(num(2))" 
    } 

    //Announcer Button 
    @IBAction func soundPlayed(_ sender: Any) { 
     //Don't have any function yet, because of my question. 
    } 
+0

가능한 복제 [스위프트 - int로 문자열 변환 (https://stackoverflow.com/questions/24115141/swift-converting-string-to-int) – Losiowaty

+0

래 난 아무것도 변환하고 싶지 않아 무엇이든. 내가 소리를 재생하는 것처럼 그들에 대한 함수를 실행하는 방식으로 pickerview에서 int를 "읽는"방법을 찾고 있습니다. 아나운서가 말하는 것을 들었습니다 : 34 번 콘솔에서 34 번까지? 그게 내가하려는 일이야. @Losiowaty – Shahin

답변

1

는이 코드로 무엇을하려고 할 수있는 더 나은 방법이 문자열을 작동하지 마십시오 숫자와 협력

..

다음 코드는 현재 값은 Int입니다. 피커 값이 변경되면 업데이트됩니다. 피커의 현재 값을 알아야하는 모든 방법에서 currentValue을 사용합니다.

아이디어는 데이터를 유지하기 위해보기를 사용하지 않는다는 것입니다. 보기는 데이터 만 표시합니다. 데이터를 별도로 보관하십시오.

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 
    @IBOutlet weak var label: UILabel! 
    @IBOutlet weak var pickerView: UIPickerView! 

    var currentValue = 0 

    func updateCurrentValue() { 
     // Use max(0, xxx) since `selectedRow` can return -1 if the component has no selection 
     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) 
    } 

    fun pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return 10 // digits 0 - 9 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     updateCurrentValue() 

     changeLabelText() 
    } 

    @IBAction func buttonPressed() { 
     currentValue = (currentValue + 1) % 1000 

     pickerView.selectRow(currentValue/100, inComponent: 0, animated: true) 
     pickerView.selectRow(currentValue/10 % 10, inComponent: 1, animated: true) 
     pickerView.selectRow(currentValue % 10, inComponent: 2, animated: true) 

     changeLabelText() 
    } 

    fileprivate func changeLabelText() { 
     label.text = String(currentValue) 
    } 

    @IBAction func soundPlayed(_ sender: Any) { 
     // Do something with currentValue 
    } 
+0

고마워, 이제 어딘가에 코드가 생겼어. UIPickerView의 Wheel이 한 번호 앞으로 움직 였을 때마다 나는이 "NEXT"UIButton을 앱에 가지고있었습니다. 이제 코딩 구조와 함께 더 이상 작동하지 않습니다. 코드를 전달하여 재 구축 할 수 있습니까? @rmaddy – Shahin

+0

"next"버튼에 대한 코드가 여전히 있습니다 -'buttonPressed'. 그것은 작동해야합니다. 버튼을 누르면 정확히 어떻게됩니까? – rmaddy

+0

휠의 한 자릿수 만 움직이고 계속 누르고 있으면 UILabel이 업데이트되지 않습니다. @rmaddy – Shahin

관련 문제