2017-01-11 8 views
-2

私がしようとしているのは、UIPickerviewerから情報を引き出し、それを配列に追加するボタンがありますが、プログラムが実行され、ボタンを押すとクラッシュします。迅速なプログラミングにはまったく新しい...より良い説明が欲しいですか?追加ボタンがクラッシュするのはなぜですか?

import UIKit 

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

    @IBOutlet weak var PickerView: UIPickerView! 

    @IBOutlet var list: [UILabel]! 

    @IBAction func add(_ sender: UIButton) { 
     var shift = true 
    } 

    @IBOutlet weak var label: UILabel! 


    var deviceList = [""] 
    var shift = false 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     label.text = "Device List" 
    } 

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

    let devices = ["Mobile Phone","Microwave","Heater","Fridge","Router","Drill"] 

    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 1    
    } 

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return devices.count 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 

     label.text = devices[row] 
     if(shift == true){ 
      deviceList.append(label.text!) 
      print(deviceList) 
      shift = false 
     }   
    }   
} 
+1

コンソールのエラーテキスト/出力を表示してください。 –

+0

あなたには完全なエラーメッセージが表示され、クラッシュする行を教えてください。さもなければ私達はあなたを助けることができない –

+0

変数** shift **の再宣言が無効です。メインクラスとuibutton関数の両方で宣言しています。 @IBActionの前に** var shift = false **を移動し、関数の本文でキーワード** var **を削除してください –

答えて

0

あなたのボタンをタップすると、あなたがクラッシュを取得している場合は、私は参照IBOutletイベントといくつかの競合の割り当てがあると仮定します。あなたのadd(_:)アクションメソッドはshiftという名前の新しいブール値プロパティを作成していないため、クラスプロパティshiftself.shift)と同じ名前でも、実際にはクラッシュは発生しません。インターフェイスビルダーでは、誤って複数のイベントを割り当てたコンセントを使用することがあり、コード内のイベントの1つを削除した場合、通常はクラッシュが発生します。たとえば、ボタンのイベント(add(_:)など)を作成した後、2番目のイベントを忘れて誤って作成したとします。その後、間違いを認識し、2番目のイベントのコードを削除しましたが、イベントのアウトレットを削除する必要があるかどうかはわかりませんでした。 Interface Builderはこの間違いを許しますが、ボタンをタップするとアプリケーションがクラッシュする原因になります。なぜなら、それはもう存在しないイベントを呼び出そうとしているからです。

IBから不必要なイベント割り当てがあるかどうかを確認するには、Interface Builderを使用して画面の左側にあるドキュメントアウトラインのボタンをクリックしてコントロールします。

enter image description here

あなたは、「参照アウトレット」ヘッダーの下にリストされている参照のアウトレットが表示されます。左上の小さな「X」をクリックして不要なものを削除することができます。また、コンセントが実際に接続されているかどうかを確認するには、右に小さな円が入っているかどうかをチェックします(接続されていることを意味します)。ここでは例を示します。この場合、私はtryAgain:というメソッドへのイベントコールを作成し、それを削除しました。ボタンをタップするとクラッシュする。

enter image description here

私は、 "X" ボタンをクリックして、tryAgain:イベントを削除した場合。ボタンをクリックするとアプリが動作します。

私はこれがあなたの問題だとは確信していませんが、あなたが共有していることに基づいて、それは私にはおそらく聞こえます。お役に立てれば。しかし、あなたのadd(_:)メソッドで実際にコードを実行することをお勧めします。

0

あなたが掲示したIBActionについて何もクラッシュを引き起こすべきではありません。関数の本体で "var"という単語を取り除いて、何もしないクラッシュを引き起こさないローカル変数を設定するのではなく、インスタンス変数の状態を変更する必要があります。

@IBOutlet weak var label: UILabel! 

コンセントが何に接続されていない場合は、しかし、その後、あなたがしようといつでも:あなたの「ラベル」コンセントはコンセントの通常である、オプションの暗黙的に開封されたとして宣言されている、と述べた

ラベルコンセントの読み書きやラベルのプロパティには、labelがnilの場合はクラッシュします。

コンセントが正しく接続されているかどうかを確認してください。そうでない場合は、あなたがピッカーを操作するときにクラッシュすると思います。 (追加ボタンをクリックしたときではありません。)

関連する問題