Swift 5 UIPickerView 数组计数无法正常工作,无法使用身高和体重计算用户 BMI
Posted
技术标签:
【中文标题】Swift 5 UIPickerView 数组计数无法正常工作,无法使用身高和体重计算用户 BMI【英文标题】:Swift 5 PickerView Array Count is not working properly enough to calucate user BMI using Height and Weight 【发布时间】:2020-05-13 03:34:04 【问题描述】:使用 2 个带有数组的 PickerView 控制器来尝试计算用户的 BMI,但重量选择器计数给了我一个线程 1:致命错误:索引超出范围。
有什么办法可以解决这个问题吗?[iPhone StoryBoard image]
//Height, Country and Weight Labels and Pickers
@IBOutlet weak var bhLabel: UILabel!
@IBOutlet weak var weightCalLabel: UILabel!
@IBOutlet weak var heightbmiLabel: UILabel!
@IBOutlet weak var heightLabel: UILabel!
@IBOutlet weak var heightScrollMenu: UIPickerView!
@IBOutlet weak var weightLabel: UILabel!
@IBOutlet weak var weightScrollMenu: UIPickerView!
let heightToInches = (12...90).map String($0)
let weightOptions = (50...600).map String($0)
func numberOfComponents(in pickerView: UIPickerView) -> Int
return 1
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if pickerView.tag == 31
return weightOptions.count
else
return heightToInches.count
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
if pickerView.tag == 30
return "\(heightToInches[row])" + " Inches"
else
return "\(weightOptions[row])" + " Lbs"
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
if pickerView.tag == 30
heightLabel.text = String(heightToInches[row]) + " Inches"
heightbmiLabel.text = "(Height " + String(heightToInches[row]) + " Inches)²"
if pickerView.tag == 31
weightLabel.text = String(weightOptions[row]) + " lbs"
weightCalLabel.text = "Weight " + String(weightOptions[row]) + " lbs"
Blockquote 如果我删除下面的所有内容,那么我的应用程序运行良好,没有任何问题。
让 stringHeight = self.heightToInches 让 IntHeight = Int(stringHeight[row])
print(stringHeight[row])
let stringWeight = self.weightOptions
块引用 let IntWeight = Int(stringWeight[row]) 这是我收到错误的地方,但是每当我删除这行代码时,我的应用程序就不会遇到致命错误:索引超出范围错误
If I delete everything below this line then I can use both pickerviews without any issues and select any
print("IntWeight = \(IntWeight!).")
let bmiconstant = 703
let CalWeight = Int(IntWeight!)
print("Cal Weight = \(CalWeight)")
let CalHeight = Int(IntHeight!)
print("CalHeight = \(CalHeight) ")
let heightSquared = CalHeight * CalHeight
print("HeightSquared = \(heightSquared)")
let WeightDividedByHeight: Double = Double(CalWeight) / Double(heightSquared)
let userBMI: Double = Double(bmiconstant) * Double(WeightDividedByHeight)
print("user bmi = \(userBMI)")
print("-------------------------")
print("")
print("")
print("")
【问题讨论】:
这意味着您的应用认为该行不在stringWeight
的计数范围内。您选择的哪一行导致错误,如果您在错误出现之前print(stringWeight)
,您会得到什么输出?
@elliott-io 我正在选择 Weight PickerView,一旦我在 weightpicker 上达到 128,打印(字符串重量)为 91。任何低于 90 的都可以,但高于 90 的所有东西都会导致应用程序崩溃
我注意到你的 heightToInches 以 90 结尾。你确定你不是不小心将它称为 90 以上的索引吗?
如这段代码没有包裹在if statement
中以确保正确的发件人:let stringHeight = self.heightToInches
let IntHeight = Int(stringHeight[row])
艾略特!好像是这个问题!我不得不删除所有代码并使用外部变量将我的 self.heightToinches[row] String 转换为 Int。因为 Pickerview 似乎使用以前的旧代码出错了
【参考方案1】:
您在didSelectRow
中的转化似乎调用了超出数据范围或数据范围的索引,例如:
let stringHeight = self.heightToInches
let IntHeight = Int(stringHeight[row])
确保它被安全地包装在 if 语句中,或使用 guard
确保它存在。
【讨论】:
以上是关于Swift 5 UIPickerView 数组计数无法正常工作,无法使用身高和体重计算用户 BMI的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 中为 UIPickerview 的 2 组件数组添加新元素
Swift 5:从 tableView numberOfRowsInSection 返回数组计数时索引超出范围
使用 Alamofire 使用 JSON 数组填充 UIPickerView 时遇到问题 |迅速
Swift:如何为 UIPickerView 中的行分配不同的数值?