点击上面的图片,查看我的Segue的简要视图。我的应用程序是一个锻炼跟踪器。我有一个类,使锻炼对象具有锻炼名称,描述等属性。我有另一个对象,创建锻炼列表,所以只是一个Workout对象的数组。
我有一个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
}
}
答案 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)
}
}
分配go后,将tableView连接到OverView中的tableView和NewWorkout中的2个动作。
这样可行。
答案 1 :(得分:0)
我猜你的故事板中没有tableView
插座 - 而且该属性是隐式解包的可选。你承诺它不会是零。