我有一个数字数组,想让用户使用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)
}
}
问题在以下行:
let currentValue = pcrReactionVolumeArray[Int(sender.value)]
您的发件人值是所需的“ currentValue”。
仅使用let currentValue = Int(sender.value)
,没有理由在这里索引到您的数组中
如果数组中有3个条目,并且要使用滑块值索引到数组中,则希望滑块将值从0(数组的第一个元素)返回到2(数组的最后一个元素) )。
请记住:您的滑块返回一个索引,而不是一个值。
更一般而言,对于具有n个元素的数组,您希望滑块的范围是0到n-1。