UITableView的崩溃到视图控制器
Cause of CrashUITableView的崩溃到视图控制器
点击上面的图片我Segue公司的简要视图。我的应用程序是一个锻炼跟踪器。我有一个类使锻炼对象具有诸如锻炼名称,描述等属性。我有另一个创建锻炼列表的对象,所以只需一个锻炼对象数组。
我有一个UITableView和它上面的按钮,让用户创建一个新的锻炼,并将其添加到workoutList数组。
每当我点击这个“创建新的锻炼”,这将导致一个新的视图控制器崩溃发生。我得到这个错误
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
}
}
它看起来像您使用的是相同的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)
}
}
分配后去和你的tableView连接的tableView的概述,并在您NewWorkout 2个动作。
这将工作。
我明白你在说什么,但不知道如何实现这一点。我是一名新开发人员,这是我的第一个应用程序。任何帮助,这将不胜感激。 –
嘿雅菲,没问题。给我2分钟为你写下这个。 – jensteichert
@JafettPuga完成 – jensteichert
我猜想tableView
插座没有连接到故事板 - 而且该属性是隐式解包的可选。你承诺它不会是零。
如果您在崩溃的行上放置一个断点并查看'tableView'的值,该怎么办?它是否为零? –
也许把日志解释崩溃类型 – GIJOW
我认为可能是由于cellForRowAt。否则在代码中添加崩溃描述 –