表视图在解开包装时发现 nil



我有 2 个UIViewControllerMainViewController -> CreateNewViewController

tableView包含在MainViewController 中。我已经将dataSourcedelegatetableView连接到MainViewController。我还连接了一个插座MainViewController.

CreateNewViewController,我会有这个:

override func viewDidLoad() {
    super.viewDidLoad()
    _ = MainViewController.init(nibName: nil, bundle: nil, createNewViewController: self)
    // Do any additional setup after loading the view.
}

Init in MainViewController 将初始化委托属性:

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, createNewViewController : CreateNewViewController) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    createNewViewController.createNewCallBack = self
}

我正在尝试使用协议函数更新tableView。我不明白为什么tableViewCreateNewViewController回来时会nil.这是回调函数:

func addNewBook(book: Book) {
    self.books.append(book)
    self.tableView.reloadData()
}

任何帮助将不胜感激!

您正在尝试将委托设置在错误的位置。根据有关准备方法的文档:

此方法的默认实现不执行任何操作。子 重写此方法并使用它来配置新的视图控制器 在显示之前。segue 对象包含信息 关于转换,包括对两个视图控制器的引用 涉及的。

您必须实现此方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let myViewController = segue.destination as? CreateNewViewController {
        myViewController.createNewCallback = self //this set the delegate
    }
}

根据你的描述,你有一个从MainVC到CreateNewVC的续集。

在 CreateNewVC 的

viewDidLoad中,您似乎试图将 CreateNewVC 的委托设置为 MainVC。但是,这不是正确的方法。

你应该在呈现CreateNewVC之前这样做,在 MainVC 的prepareForSegue方法中。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? CreateNewViewController {
        vc.createNewCallback = self
    }
}

最新更新