2015-11-18 117 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

相關問題