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.heightToIncheslet 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 中的行分配不同的数值?

如何解决问题 UIPickerView 致命错误:索引超出范围 [IOS Swift 5.1 Xcode 11.2]

UIPickerView 在 Swift 中选择 title == String 的行