Swift: 从 UIPickerView 读取
Swift: Reading from an UIPickerVIew
我正在尝试从 UIPickerView
中读取 int
s,我已经这样做了,但这只是 UILabel
上的打印。这次我需要数据,这样我就可以为每个号码播放声音,这样我就可以制作一个队列播音员(它是一个 3 位数 UIPickerView
,从“001”到“999”开始。看,我不知道为每个组件的选定数字提供声音的代码。(我已经通过 AVFoundation
导入了声音,但我不会将其粘贴到我的代码中)。正如我在评论中提到的,转换是'我的问题。所以这个问题是新的。
这是我目前所拥有的:
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.
}
有一种更好的方法来完成您尝试使用此代码执行的操作。不要使用字符串。处理数字。
以下代码将当前值作为 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)
}
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()
}
@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
}
我正在尝试从 UIPickerView
中读取 int
s,我已经这样做了,但这只是 UILabel
上的打印。这次我需要数据,这样我就可以为每个号码播放声音,这样我就可以制作一个队列播音员(它是一个 3 位数 UIPickerView
,从“001”到“999”开始。看,我不知道为每个组件的选定数字提供声音的代码。(我已经通过 AVFoundation
导入了声音,但我不会将其粘贴到我的代码中)。正如我在评论中提到的,转换是'我的问题。所以这个问题是新的。
这是我目前所拥有的:
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.
}
有一种更好的方法来完成您尝试使用此代码执行的操作。不要使用字符串。处理数字。
以下代码将当前值作为 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)
}
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()
}
@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
}