UITableView在查看控制器的Segue上崩溃

时间:2017-07-28 17:02:37

标签: ios iphone uitableview swift3

Cause of Crash

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

我有一个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

    }

}

2 个答案:

答案 0 :(得分:1)

看起来您在故事板中为两个视图使用相同的ViewController。 这意味着,当您按下“AddNewWorkoutController”时,viewDidLoad需要一个tableView - 它不存在,因为故事板没有为此视图构建任何内容。

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

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

创建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)

}

}

现在进入故事板,选择控制器并分配正确的类:like this

分配go后,将tableView连接到OverView中的tableView和NewWorkout中的2个动作。

这样可行。

答案 1 :(得分:0)

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