【发布时间】: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