arrays - 带有数字数组的 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)
}
}
解决方案
问题在以下行:
let currentValue = pcrReactionVolumeArray[Int(sender.value)]
您的发件人值是您想要的“currentValue”。
只是使用let currentValue = Int(sender.value)
,没有理由在这里索引到您的数组
推荐阅读
- html - 如何在 React 中通过单击锚标记 ( ) 更顺畅地过渡到同一页面的另一个部分?
- google-earth-engine - 你如何计算rgee中一个区域中所有像素的面积?
- python - NameError:未定义名称“to_date”
- r - 将数据框传递给函数
- java - 如何正确使用 CountDownLatch 测试特定线程交错
- java - 在邮递员中获得 200,但在放心邮寄方法中获得 400
- excel - 奇怪的文字问题
- scala - 使用 scala 生成句子使用流
- json - 在 Flutter 中解析嵌套的 JSON 对象
- mysql - 如何在sql中选择*但不同的两列对?