【问题标题】:UITableView Crashes on Segue to View ControllerUITableView 在 Segue 到 View Controller 时崩溃
【发布时间】:2017-07-28 17:02:36
【问题描述】:

Cause of Crash

单击上面的图片可以简要了解我的 Segue。我的应用程序是一个锻炼追踪器。我有一个类,它使锻炼对象具有锻炼名称、描述等属性。我有另一个创建锻炼列表的对象,所以只是一组锻炼对象。

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

每当我单击此“创建新锻炼”时,就会发生崩溃,该“创建新锻炼”会连接到新的视图控制器。我收到此错误

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

    }

}

【问题讨论】:

  • 如果在崩溃的行上放一个断点并查看tableView的值呢?是非零吗?
  • 也许会放上解释崩溃类型的日志
  • 我认为可能是由于 cellForRowAt。否则在代码中添加崩溃描述
  • @Maddyヅヅ 我是新开发者:\我如何获取崩溃日志?
  • 你的调试器会打印出它的描述“Terminating app due to”

标签: ios iphone uitableview swift3


【解决方案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)

}

}

现在进入 Storyboard,选择控制器并分配正确的类:

在分配 go 并将您的 tableView 连接到 OverView 中的 tableView 和 NewWorkout 中的 2 个操作之后。

这会起作用。

【讨论】:

  • 我明白你在说什么,但不知道如何实现。我是一名新开发人员,这是我的第一个应用程序。对此的任何帮助将不胜感激。
  • 嘿,贾菲特,没问题。给我 2 分钟的时间给你写下来。
  • 非常感谢您的帮助!
【解决方案2】:

我猜tableView 插座没有连接到您的情节提要中 - 并且该属性是一个隐式展开的可选。你保证它不会是零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多