2017-07-28 91 views
0

Cause of CrashUITableView的崩溃到视图控制器

点击上面的图片我Segue公司的简要视图。我的应用程序是一个锻炼跟踪器。我有一个类使锻炼对象具有诸如锻炼名称,描述等属性。我有另一个创建锻炼列表的对象,所以只需一个锻炼对象数组。

我有一个UITableView和它上面的按钮,让用户创建一个新的锻炼,并将其添加到workoutList数组。

每当我点击这个“创建新的锻炼”,这将导致一个新的视图控制器崩溃发生。我得到这个错误

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

它看起来像您使用的是相同的ViewController在你的故事板两种观点。 这意味着,当您推送到“AddNewWorkoutController”时,viewDidLoad需要一个tableView--它不在那里,因为storyboard没有为这个视图构建任何东西。

您应该创建2个VCS。一个用于“添加新按钮”和tableview的OverView,另一个用于实际创建它。

这里是一个完整的解决方案:

创建2个新的快捷文件:

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 

    } 

} 

and

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) 

} 

} 

现在进入故事板,选择控制器和分配权类:like this

分配后去和你的tableView连接的tableView的概述,并在您NewWorkout 2个动作。

这将工作。

+0

我明白你在说什么,但不知道如何实现这一点。我是一名新开发人员,这是我的第一个应用程序。任何帮助,这将不胜感激。 –

+0

嘿雅菲,没问题。给我2分钟为你写下这个。 – jensteichert

+0

@JafettPuga完成 – jensteichert

0

我猜想tableView插座没有连接到故事板 - 而且该属性是隐式解包的可选。你承诺它不会是零。