#ios #swift #uikit
#iOS #swift #uikit
Вопрос:
Я работаю над книгой ученика iOS Рэя Вендерлиха и застрял во втором проекте. У ListDetailViewController
меня есть кнопка, которая вызывает функцию done()
. Эта функция работает, поскольку она выводит «Нажата кнопка «Готово»». Однако ListDetailViewController
не переходит обратно к AllListsTableViewController
.
Я подозреваю, что это связано с тем, что метод делегирования listDetailViewControllerDidAdd
не вызывается done()
функцией. Я рассуждаю о том, что listDetailViewControllerDidAdd
метод не печатает «Выполненную кнопку, вызываемую методом делегирования», поэтому done()
не вызывает метод делегирования. Правильно ли это рассуждение? Если да, то почему это так?
Я проверил другие вопросы по SO, и большинство ответов указывают на неназначенное delegate
значение. Тем не менее, я уже назначил delegate
func prepare(for segue: )
. Ниже приведены коды.
ListDetailViewController.swift
protocol ListDetailViewControllerDelegate: class {
func listDetailViewControllerDidCancel(_ controller: ListDetailViewController)
func listDetailViewControllerDidAdd(_ controller: ListDetailViewController, didFinishAdding checklist: Checklist)
func listDetailViewControllerDidEdit(_ controlelr: ListDetailViewController, didFinishEditing checklist: Checklist)
}
class ListDetailViewController: UITableViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField!
@IBOutlet var doneBarButton: UIBarButtonItem!
weak var delegate: ListDetailViewControllerDelegate?
var checklistToEdit: Checklist?
@IBAction func done() {
if let checklist = checklistToEdit {
checklist.name = textField.text!
delegate?.listDetailViewControllerDidEdit(
self,
didFinishEditing: checklist)
} else {
let checklist = Checklist(name: textField.text!)
delegate?.listDetailViewControllerDidAdd(
self,
didFinishAdding: checklist)
print("Done button is clicked")
print("(checklist.name)")
}
}
}
AllListsTableViewController.swift
class AllListsTableViewController: UITableViewController, ListDetailViewControllerDelegate {
func listDetailViewControllerDidAdd(_ controller: ListDetailViewController,
didFinishAdding checklist: Checklist) {
print("Done button called delegate method" )
let newRowIndex = lists.count
lists.append(checklist)
let indexPath = IndexPath(row: newRowIndex, section: 0)
let indexPaths = [indexPath]
tableView.insertRows(at: indexPaths, with: .automatic)
navigationController?.popViewController(animated: true)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ShowChecklist" {
let controller = segue.destination as! CheckListViewController
controller.checklist = sender as? Checklist
} else if segue.identifier == "AddChecklist" {
let controller = segue.destination as! ListDetailViewController
controller.delegate = self
}
}
}
Какие шаги вы рекомендуете для изучения и решения этой проблемы? Спасибо!
Комментарии:
1. Я не писал код для iOS более года, но я думаю, что проблема заключается в следующей строке. пусть controller = segue. назначение как! ListDetailViewController
2. Кроме того, не разворачивайте переменную принудительно.
3.
controller.delegate = self
Вызывается? «большинство ответов указывают на неназначенное значение делегата» просто протестируйте его, делайтеprint("delegate: (delegate)")
то, что делаетеprint("(checklist.name)")
.4. Печать значения делегата показывает, что оно есть на самом деле
nil
. Почему это так?5.
let controller = segue.destination as! ListDetailViewController; controller.delegate = self
Даже вызывается?