2016-09-05 7 views
2

現在、私は最初の自分の電卓で迅速に学習しています。 ボタンを使って結果を計算しましたが、少し改善したかったのです。 UIは、基本的に数値の2つのテキストフィールド、演算子の1つのセグメント化されたコントロール、および結果を表示する1つのラベルで構成されます。だから私は何をしたいのですか:セグメント化された制御インデックスにアクセスしようとすると、スウィフトがエラーをスローする

セグメント化された制御値を変更するたびに、新しい結果を計算して表示する必要があります。

エラー:

[Calculator.MainInterfaceViewController operatorChanged:]:認識されていないセレクタがキャッチされない例外により 'NSInvalidArgumentException'、理由にアプリを終了XXXX ... *インスタンスに送信:「 - [Calculator.MainInterfaceViewController operatorChanged: ]:認識されていないセレクタがインスタンスに送信XXXX *まずスローコールスタック: ... のlibC++ abi.dylib:タイプのキャッチされない例外で終了NSException (lldb)

マイクラス:

class MainInterfaceViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet var ersteZahl: UITextField! 
@IBOutlet var zweiteZahl: UITextField! 

@IBOutlet weak var ergebnisLabel: UILabel! 
@IBOutlet weak var segment: UISegmentedControl! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    ersteZahl.delegate = self; 
    zweiteZahl.delegate = self; 
} 

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 

    let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString 
    textField.text = newString as String 
    refreshUIElements() 
    return false 
} 

@IBAction func operatorChanged() { 
    refreshUIElements() 
} 


func refreshUIElements() { 
    let zahl1 = NSString(string: ersteZahl.text!).doubleValue 
    let zahl2 = NSString(string: zweiteZahl.text!).doubleValue 

    switch self.segment.selectedSegmentIndex { 
    case 0: 
     ergebnisLabel.text = "Ergebnis: \(zahl1 + zahl2)" 
    case 1: 
     ergebnisLabel.text = "Ergebnis: \(zahl1 - zahl2)" 
    case 2: 
     ergebnisLabel.text = "Ergebnis: \(zahl1 * zahl2)" 
    case 3: 
     if zahl2 == 0 { 
      ergebnisLabel.text = "Error: Cannot divide by 0." 
      return 
     } 
     ergebnisLabel.text = "Ergebnis: \(zahl1/zahl2)" 
    default: 
     break 
    } 
} 


} 
+0

どこで 'operatorChanged'を呼び出しましたか?問題は、あなたのメソッドにはパラメータはありませんが、エラーは、同じ名前でパラメータを持つメソッドを呼び出しているというエラーです(後ろに ":"があります)。ストーリーボードとリンクしましたか? YESの場合は、IBActionが何者か、送信者、またはストーリーボードで再リンクすることを受け入れるために、あなたの名前を 'operatorChanged'に変更します。 – Larme

+0

@Larmeええ、私はメインストーリーボードでリンクしました。私はすでにそれを再リンクしようとしました。それを修正する方法がありますか?ありがとうございます:) – dv02

答えて

2

自動生成されたメソッドまたは手動で作成しようとしたメソッドを変更したと思いますか?

@IBAction'sは、senderパラメータを必要とします。

operatorChanged(sender: UISegmentedControl) { 
} 

メソッドを完全に削除し、ストーリーボードからCtrl +ドラッグして再度ファイルにドラッグします。ポップアップの場合は、アクションを選択し、メソッドに名前を付けます。この後にメソッド定義を変更しないでください。そうしないと、同じ問題が発生します。

+0

答えをありがとう、完璧に動作:) – dv02

関連する問題