首页 > 解决方案 > 带有数字数组的 UISlider

问题描述

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

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





}

标签: arraysswiftuislider

解决方案


问题在以下行:

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

您的发件人值您想要的“currentValue”。

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


推荐阅读