【问题标题】:Why delegate event is not received swift?为什么没有迅速收到委托事件?
【发布时间】:2019-01-25 20:31:54
【问题描述】:

我想使用委托将数据从EditPostViewController 传递到NewsfeedTableViewController,但在采用class NewsfeedTableViewController 时从未调用func remove(mediaItem:_)。我做错了什么?

  NewsfeedTableViewController: UITableViewController, EditPostViewControllerDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()

   //set ourselves as the delegate
   let editPostVC = storyboard?.instantiateViewController(withIdentifier: "EditPostViewController") as! EditPostViewController
    editPostVC.delegate = self
 }

  //remove the row so that we can load a new one with the updated data
      func remove(mediaItem: Media) {
        print("media is received heeeee")
        // it does't print anything
    }
}


   extension NewsfeedTableViewController {

//when edit button is touched, send the corresponding Media to EditPostViewController
     func editPost(cell: MediaTableViewCell) {

    let editPostVC = storyboard?.instantiateViewController(withIdentifier: "EditPostViewController") as? EditPostViewController
     guard let indexPath = tableView.indexPath(for: cell) else {
        print("indexpath was not received")
        return}

     editPostVC?.currentUser = currentUser
     editPostVC?.mediaReceived = cell.mediaObject
     self.navigationController?.pushViewController(editPostVC!, animated: true)
 }




 protocol EditPostViewControllerDelegate: class {
   func remove(mediaItem: Media)
 }

 class EditPostViewController: UITableViewController {

  weak var delegate: EditPostViewControllerDelegate?

   @IBAction func uploadDidTap(_ sender: Any) {

    let mediaReceived = Media() 
    delegate?.remove(mediaItem: mediaReceived)
  }
}

【问题讨论】:

  • 你在用editPostVC做些什么吗?您从情节提要创建它,但从不将其添加到任何内容中。所以它当前不在视图层次结构中接收点击。 (除非您将该代码排除在此示例之外)
  • NewsfeedTableViewController 展示了一些帖子。在新闻源上有一个按钮edit,它在点击甚至点击时实例化editPostVC。当 editPostVC 必须将数据传回 newfeed 时,它位于视图层次结构中。我刚刚更新了我的问题以显示 editPostVC 如何从新闻源实例化
  • 好的,所以将使 editPost.delegate = self 的行添加到实例化 editPostVC 的代码块中,因为每次调用 editPost 它都不会添加到新实例中
  • 它有效。现在我明白了。谢谢

标签: swift delegation


【解决方案1】:

在 viewDidLoad(:) 和编辑按钮单击事件中实例化的对象不是同一个对象。做一个变量

var editPostVC: EditPostViewController?

用委托在 viewDidLoad(:) 中实例化

editPostVC = storyboard?.instantiateViewController(withIdentifier: "EditPostViewController") as! EditPostViewController
editPostVC.delegate = self

然后在点击事件中呈现它

navigationController?.pushViewController(editPostVC, animated: true)

present(editPostVC, animated: true, completion: nil)

您可以在演示 VC 之前或之后将数据从演示者传递给演示的 VC。

editPostVC.data = self.data

【讨论】:

  • 在func editPost(cell: MediaTableViewCell) {}中每次都需要实例化,否则就是没有把数据传给呈现的视图控制器,即editPostVC
  • 当然你可以传递数据而不用重新实例化它。你有视图控制器的对象引用。只需在 present() 方法调用或 navigationController?.pushViewController() 调用之前或之后设置 editPost(cell: MediaTableViewCell) 方法中的数据。例如:
  • func editPost(cell: MediaTableViewCell) { // place your code present(editPostVC, animated: true, completion: nil) editPostVC.data = self.data // set the data }@bibscy
【解决方案2】:

我建议在NewsfeedTableViewController拥有一处房产

var editPostViewController: EditPostViewController?

然后在您实例化 EditPostViewController 时分配给它。

这个想法是当NewsfeedTableViewController.viewDidLoad 返回时,它会停止自动释放类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    相关资源
    最近更新 更多