【问题标题】:EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode=0x0)EXC_BAD_INSTRUCTION(代码 = EXC_I386_INVOP,子代码 = 0x0)
【发布时间】:2016-02-19 17:26:26
【问题描述】:

我正在创建一个温度转换器。当我运行应用程序时;输入温度,选择转换并单击转换。出现错误。 错误是:EXC_BAD_INSTRUCTION(代码 = EXC_I386_INVOP,子代码=0x0)

这是我的 ViewController 代码:

import UIKit

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {

@IBOutlet weak var orginalValue: UITextField!

@IBOutlet weak var convertFrom: UIPickerView!
let pickerData = ["Celsius", "Fahrenheit"]

override func viewDidLoad() {
    super.viewDidLoad()
    convertFrom.dataSource = self
    convertFrom.delegate = self
}

@IBOutlet weak var labelConvertFrom: UILabel!

@IBOutlet weak var convertTo: UIPickerView!

@IBOutlet weak var labelConverTo: UILabel!

@IBOutlet weak var answer: UILabel!

@IBAction func convertButton(sender: AnyObject) {
    let a = Double(orginalValue.text!)
    let tempConvertM = TempConvert(temp: a!)
    answer.text = String(tempConvertM.convert())

}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return pickerData.count
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return pickerData[row]
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    labelConvertFrom.text = pickerData[row]
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

这是我得到错误的地方。 TempConverterModel.swift

 import Foundation

 extension ViewController{
 class TempConvert{

    var temp:Double
    var view = ViewController()

    init (temp:Double){
        self.temp = temp
    }

    func convert()->Double{
        if(view.labelConvertFrom.text == "Celsius"){ -->ERROR IS HIGHLIGHTED HERE <--
           view.labelConverTo.text = "Fahrenheit"
           return (temp-32)/1.8000; //fahrenheit formula
        }
        else{
            view.labelConverTo.text = "Celsius"
            return (temp*1.8000)+32; //celsius formula
        }

    }
}
}

我不知道我做错了什么。我想检查 labelConvertFrom 中的文本并检查它是否等于“Celsius”。如果它没有返回答案。

我非常感谢任何人的帮助。谢谢!

【问题讨论】:

    标签: swift compiler-errors exc-bad-instruction


    【解决方案1】:

    问题大致源于class TempConvert中的这一行:

    var view = ViewController()

    这里你正在初始化一个空的视图控制器。您定义的插座(例如labelConvertFrom)没有连接到任何东西,所以当您尝试在此处尊重它们时:

    view.labelConvertFrom.*text

    你崩溃了(具体来说,你在我放置* 字符的地方崩溃了)。您崩溃的原因是因为此时labelConvertFromnil

    要使其正常工作,您需要使用 initWithNibName:bundle: 方法初始化 ViewController,并传递正确的 nib 文件名和包 ID(可能只是 NSBundle.mainBundle())。

    这样做可以让您的插座正确连接,然后当您尝试使用它们时它们不会是nil

    【讨论】:

    • 我很抱歉。我是 Swift 新手,这是我第一个使用 iOS 的应用程序,我不太了解。如何初始化 ViewController?我会在 ViewController 类或 TempCovert 中这样做吗?
    • let viewController = UIViewController(nibName: "mynibfile.xib", bundle: NSBundle.mainBundle()) ... 当然,将 nibName 参数替换为您的 nib 文件的实际名称。
    • 您可以在TempConvertclass 中进行操作。另一个侧面说明,就它的工作而言完全不重要,但TempConvert 类不应该是UIViewController 的扩展类。只需将其放入自己的文件TempConvert.swift 并删除封闭的extension UIViewController {}
    • 这是否意味着我必须创建一个 nib 文件?我没有看到任何带有 .xib 的文件
    • 非常感谢您的帮助。
    【解决方案2】:

    正如par 指出的那样,您应该删除封闭的extension ViewController { } 并将您的TempConvert 作为一个单独的类。

    另外,不要尝试访问TempConvert 中的ViewController 的实例变量,您应该在ViewController 类本身的convertButton() 方法中进行比较,并在@987654329 中调用适当的转换方法@ 班级。

    更好的方法是在 ViewController 类中为“Celsius”存储一个属性,为“Fahrenheit”存储一个计算属性。你可以参考这个link Swift 语言中的属性

    【讨论】:

    • 这行得通。我按照你说的做了,在convertButton中做了比较。非常感谢!
    • 如果这对您有用,您可以将其标记为已回答 :)
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多