2015-11-18 118 views
3

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

这是我的代码视图控制器:

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中的文本,并检查它是否等于“摄氏度”。如果它没有,然后返回答案。

我真的很感谢任何人的帮助。谢谢!

回答

2

由于par指出,你应该删除封闭的extension ViewController { }并让你的TempConvert作为一个单独的类。

此外,而不是试图访问TempConvertViewController的实例变量,你应该做的比较在convertButton()方法ViewController类本身并调用相应的转换方法,TempConvert类。

更好的方法是在ViewController类中为“摄氏度”存储属性并为“华氏度”计算属性。你可以参考这个link为斯威夫特语言属性

+0

这工作。我按照你说的做了,并在convertButton中进行了比较。 非常感谢! –

+0

如果这对你有用,你可以将它标记为已回答:) –

2

的问题广泛地从该行茎class TempConvert

var view = ViewController()

这里要初始化一个空的视图控制器。你定义如labelConvertFrom的插座不挂接到任何东西,所以当你试图在这里尊重他们:

view.labelConvertFrom.*text

你崩溃(具体地讲,你崩溃,我把*字符)。你崩溃的原因是因为在那一点,labelConvertFromnil

为了让这个工作正常,你需要使用initWithNibName:bundle:方法初始化ViewController,传递正确的nib文件名和bundle id(可能只是NSBundle.mainBundle())。

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

+0

我的歉意。我是新来的Swift,这是我的第一个应用程序与iOS 我不太明白。我如何初始化ViewController? 我会在ViewController类或TempCovert中做到这一点? –

+0

'let viewController = UIViewController(nibName:“mynibfile.xib”,bundle:NSBundle.mainBundle())'...当然用您的nib文件的实际名称替换nibName参数。 – par

+0

您可以在'TempConvert'类中执行此操作。另一方面,它完全无关紧要,但TempConvert类不应该是UIViewController的扩展类。只需将它放在自己的文件TempConvert.swift中,然后移除附加的扩展UIViewController { – par

相关问题