Метод делегирования Swift не вызывается

#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 Даже вызывается?