【问题标题】:Swift: Reading from an UIPickerVIewSwift:从 UIPickerVIew 读取
【发布时间】:2017-09-18 23:34:05
【问题描述】:

我正在尝试从UIPickerView 读取ints,我已经这样做了,但这只是UILabel 上的打印。这次我需要数据,这样我就可以为每个号码添加声音,这样我就可以制作一个队列播音员(它是一个 3 位数的 UIPickerView,从“001”到“999”开始。看我不知道代码给每个组件的选定数字一个声音。(我已经通过AVFoundation 导入了声音,但我不会将它粘贴到我的代码中)。正如我在 cmets 中提到的,转换不是我的问题. 所以这个问题是新的。 到目前为止,这是我所拥有的:

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.
    }

【问题讨论】:

  • 朋友,我不想把任何东西转换成任何东西。我正在寻找一种从pickerview“读取”整数的方法,就像在它们上运行功能一样,比如播放声音。有没有听过播音员说:34 号到控制台#2?这就是我想要做的。 @Losiowaty

标签: ios swift int uipickerview


【解决方案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)
    }

    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
    }

【讨论】:

  • 谢谢,我现在正在使用您的代码。但是我的应用程序中有这个“NEXT”UIButton,只要按下它,UIPickerView 的滚轮就会向前移动一个数字。现在有了你的编码结构,它不再工作了,你能传递一个代码以便我重建它吗? @rmaddy
  • “下一步”按钮的代码仍然存在 - buttonPressed。它应该工作。当您点击按钮时会发生什么?
  • 它只在滚轮上移动一位数字,并且当您按住时不会做更多事情,并且 UILabel 不会更新(不仅仅是它移动的一位数字)。 @rmaddy
  • 糟糕 - 我看到了问题。在我的buttonPressed 方法中,您需要在currentValue 之前删除let
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多