具有数字数组的UISlider

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

我有一个数字数组,想让用户使用UISlider选择哪个数字。但是,使用我当前的代码,每当我模拟该应用程序并尝试移动UISlider时,该应用程序就会崩溃并在IBAction函数func reactionVolumeSlider中显示“线程1:致命错误:索引超出范围”。我只有3个数字可以从数组10、20和50中选择。

      import UIKit

class SelectAttributesViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    @IBOutlet weak var kitPickerView: UIPickerView!
    @IBOutlet weak var reactionVolumeLabel: UILabel!
    @IBOutlet weak var numberOfSampleTextField: UITextField!
    @IBOutlet weak var volumeOfTemplateDNATextField: UITextField!
    @IBOutlet weak var slider: UISlider!


    let kits = ["Kit 1", "Kit 2"]
    let pcrReactionVolumeArray = [10,20,50]

    override func viewDidLoad() {
        super.viewDidLoad()
        self.numberOfSampleTextField.delegate = self
        self.volumeOfTemplateDNATextField.delegate = self
        kitPickerView.dataSource = self
        kitPickerView.delegate = self

        //slider.addTarget(self, action: "reactionVolumeSlider", for: .valueChanged)

        let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))
        view.addGestureRecognizer(tap)

        // Do any additional setup after loading the view.
    }


    @IBAction func reactionVolumeSlider(_ sender: UISlider) {
        let currentValue = pcrReactionVolumeArray[Int(sender.value)]
        reactionVolumeLabel.text = "\(currentValue) μL"

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

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

    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if row == 0{ print(kits[row])

        }else if row == 1{
           createAlert(title: "Kit not available", message: "More kits will be added soon!")
        }

    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return kits[row]
    }
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
           guard let oldText = textField.text, let r = Range(range, in: oldText) else {
               return true
           }

           let newText = oldText.replacingCharacters(in: r, with: string)
           let isNumeric = newText.isEmpty || (Double(newText) != nil)
           let numberOfDots = newText.components(separatedBy: ".").count - 1

           let numberOfDecimalDigits: Int
           if let dotIndex = newText.firstIndex(of: ".") {
               numberOfDecimalDigits = newText.distance(from: dotIndex, to: newText.endIndex) - 1
           } else {
               numberOfDecimalDigits = 0
           }

           return isNumeric && numberOfDots <= 1 && numberOfDecimalDigits <= 2
       }
    func createAlert (title: String, message: String){
           let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert)
           alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: { (Action) in
               alert.dismiss(animated: true, completion: nil)
           }))
           self.present(alert, animated: true, completion: nil)
       }





}
arrays swift uislider
2个回答
1
投票

问题在以下行:

let currentValue = pcrReactionVolumeArray[Int(sender.value)]

您的发件人值所需的“ currentValue”。

仅使用let currentValue = Int(sender.value),没有理由在这里索引到您的数组中


0
投票

如果数组中有3个条目,并且要使用滑块值索引到数组中,则希望滑块将值从0(数组的第一个元素)返回到2(数组的最后一个元素) )。

请记住:您的滑块返回一个索引,而不是一个值。

更一般而言,对于具有n个元素的数组,您希望滑块的范围是0到n-1。

© www.soinside.com 2019 - 2024. All rights reserved.