学校のプロジェクトで作っているTo Do Listアプリについて、困っています。
私が使っているのは
Xcode Version 8.1
Swift 2.0 です。
私はまだプログラミングを始めたばかりの初心者で、このアプリもチュートリアルを見て作っています。
こちらが私の見ているチュートリアルです:
https://www.youtube.com/watch?v=Md0KDy6DCAc
また、この方のフルコードが載っているサイトがこれです:
https://github.com/mobilespace/ToDoList
コードを全て書き終えてシミュレーターを起動し、To Do Itemを足そうとしたのですが、Itemをセーブしようと Save を押したらコードへ戻り、
"Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP, subcode=0×0)"
と出てきました。
出てきたところは AddToDoItemController.swiftの
delegate?.addToDoItemToList(toDoItemField.text!)
というラインです。
デバッグコンソールには
To Do List[55266:2935900] [MC] Reading from private effective user
settings. fatal error: unexpectedly found nil while unwrapping an
Optional value (lldb)
と出ていました。
bad instructionということは、きちんと指示ができていない、ということだというのは分かるのですが、何が足りないのでしょうか?
また、何が足りないのかを調べる方法はありますか?
コードのコピーです:
AddToDoItemController.swift
import UIKit
protocol AddToDoItemControllerDelegate: class {
func addToDoItemToList(_ text:String)
}
class AddToDoItemController: UIViewController {
@IBOutlet weak var toDoItemField: UITextField!
weak var delegate: AddToDoItemControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func cancelBarButtonPressed(_ sender: AnyObject) {
self.dismiss(animated: true, completion: nil)
}
@IBAction func saveBarButtonPressed(_ sender: AnyObject) {
delegate?.addToDoItemToList(toDoItemField.text!)
self.dismiss(animated: true, completion: nil)
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AddToDoItemControllerDelegate {
@IBOutlet weak var tableView: UITableView!
var toDoList: NSMutableArray = ["Go get groceries", "Walk the dog", "Watch a movie", "Do your homework"]
var completedToDoList: [Int:String] = [:]
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
override func viewWillAppear(_ animated: Bool) {
resetAccessoryType()
tableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return toDoList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ToDoCell", for: indexPath)
cell.textLabel?.text = toDoList[indexPath.row] as? String
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func resetAccessoryType() {
for row in 0..<toDoList.count {
if let cell = tableView.cellForRow(at: IndexPath(row: row, section: 0)) {
cell.accessoryType = .none
}
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let cell = tableView.cellForRow(at: indexPath) {
if cell.accessoryType == .none {
cell.accessoryType = .checkmark
completedToDoList[completedToDoList.count] = toDoList[indexPath.row] as? String
toDoList.removeObject(at: indexPath.row)
} else {
cell.accessoryType = .none
}
}
}
func addToDoItemToList(_ text:String) {
toDoList[toDoList.count] = text
tableView.reloadData()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "AddToDoItemSegue") {
let navigationController = segue.destination as! UINavigationController
let addToDoItemViewController = navigationController.topViewController as! AddToDoItemController
addToDoItemViewController.delegate = self
} else if(segue.identifier == "CompletedToDoItemsSegue") {
let completedToDoItemsController = segue.destination as! CompletedToDoItemsController
completedToDoItemsController.completedToDoList = completedToDoList
}
}
}
よろしくお願いします。