2017-07-28 7 views
0

Cause of CrashのUITableViewクラッシュ

私のセグエの簡単なビューのために上の画像をクリックしてください。私のアプリはトレーニングトラッカーです。ワークアウト名、説明などのプロパティを持つワークアウトオブジェクトを作成するクラスがあります。私はワークアウトリストを作成する別のオブジェクトを持っているので、Workoutオブジェクトの配列だけです。

私はUITableViewとその上にユーザーが新しいワークアウトを作成し、それをworkoutList配列に追加するためのボタンを持っています。

「新しいワークアウトを作成する」をクリックすると、クラッシュが発生します。これは、新しいView Controllerにつながります。私はあなたがあなたのストーリーボードの両方のビューで同じのViewControllerを使用しているように見える

Crash Error

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var setStepper: UILabel! 
    @IBOutlet weak var repStepper: UILabel! 

    @IBOutlet weak var workoutName: UITextField! 
    @IBOutlet weak var workoutDescription: UITextField! 

    @IBOutlet weak var tableView: UITableView! 

    var workoutList = WorkoutList().listOfWorkouts 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 

    } 

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

    @IBAction func stepperCounter(_ sender: UIStepper) { 
     if sender.tag == 1 { 
      setStepper.text = "\(Int(sender.value))" 
     } 
     else if sender.tag == 2 { 
      repStepper.text = "\(Int(sender.value))" 
     } 
    } 

    @IBAction func addToWorkout(_ sender: Any) { 

     //I know this is terrible fixing later. Just for Testing right now 
     let newWorkout : Workout = Workout(Name: workoutName.text!, Description: workoutDescription.text!, Sets: Int(setStepper.text!)!, Reps: Int(repStepper.text!)!) 

     workoutList.append(newWorkout) 
     print(workoutList.count) 

    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return workoutList.count 

    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = UITableViewCell() 
     cell.textLabel?.text = "Hello" 
     return cell 

    } 

} 
+0

クラッシュする行にブレークポイントを置き、 'tableView'の値を​​見るとどうなりますか?それは非ですか? –

+0

そしておそらく、クラッシュタイプを説明するログを入れてください。 – GIJOW

+0

私はcellForRowAtに起因するかもしれないと思います。コード内にクラッシュの説明を追加する –

答えて

1

このエラーが発生します。 つまり、 "AddNewWorkoutController"にプッシュすると、viewDidLoadは、このビューのためにストーリーボードが作成されていないため、そこにはないtableViewが必要です。

2つのVCSを作成する必要があります。 1つはOverViewのための "新しいボタンを追加"とテーブルビューと実際にそれを作成するためのものです。ここ

は完全なソリューションです:

は、2つの新しいSWIFTファイルを作成します。

OverViewViewController.swift & NewWorkoutViewController.swift

を私はちょうど2 VCのにコードを分離:

import UIKit 

class OverViewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    var workoutList = WorkoutList().listOfWorkouts 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 

    } 

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return workoutList.count 

    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = UITableViewCell() 
     cell.textLabel?.text = "Hello" 
     return cell 

    } 

} 

および

import UIKit 

class NewWorkoutViewController: UIViewController { 

@IBOutlet weak var setStepper: UILabel! 
@IBOutlet weak var repStepper: UILabel! 

@IBOutlet weak var workoutName: UITextField! 
@IBOutlet weak var workoutDescription: UITextField! 


override func viewDidLoad() { 
    super.viewDidLoad() 
} 

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

@IBAction func stepperCounter(_ sender: UIStepper) { 
    if sender.tag == 1 { 
     setStepper.text = "\(Int(sender.value))" 
    } 
    else if sender.tag == 2 { 
     repStepper.text = "\(Int(sender.value))" 
    } 
} 

@IBAction func addToWorkout(_ sender: Any) { 

    //I know this is terrible fixing later. Just for Testing right now 
    let newWorkout : Workout = Workout(Name: workoutName.text!, Description: workoutDescription.text!, Sets: Int(setStepper.text!)!, Reps: Int(repStepper.text!)!) 

    workoutList.append(newWorkout) 
    print(workoutList.count) 

} 

} 

は今、ストーリーボードに入るのコントローラを選択し、右側のクラスに割り当てる:GOを割り当てた後like this

をし、概要でのtableViewとあなたのNewWorkoutで2つのアクションにあなたのtableViewを接続します。

これは動作します。

+0

私はあなたが言っていることを理解していますが、私は新しい開発者です。これが私の最初のアプリです。これに関する助けがあれば大いに感謝します。 –

+0

ちょっとJaffet、問題ありません。私のためにこれを書き留めてください。 – jensteichert

+0

@JafettPuga done – jensteichert

0

私は、tableViewのアウトレットがあなたのストーリーボードに組み込まれていないと思います。そのプロパティはです。暗黙的にアンラップされたオプションのです。あなたはそれが無駄ではないと約束している。

関連する問題