swift - tableView在展开时找到了nil

时间:2017-10-13 06:44:30

标签: ios swift uitableview

我有2 UIViewControllerMainViewController - > CreateNewViewController

tableView包含在MainViewController中。我已将dataSource的{​​{1}}和delegatetableView联系起来。我还将一个插座连接到MainViewController

MainViewController中,我会这样:

CreateNewViewController

初始化override func viewDidLoad() { super.viewDidLoad() _ = MainViewController.init(nibName: nil, bundle: nil, createNewViewController: self) // Do any additional setup after loading the view. } 的初始化委托属性:

MainViewController

我正在尝试使用协议func更新init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, createNewViewController : CreateNewViewController) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) createNewViewController.createNewCallBack = self } 。我不明白为什么tableViewtableView返回时会nilCreateNewViewController。这是回调函数:

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

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

  

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

您必须实现此方法:

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

答案 1 :(得分:0)

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

在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
    }
}