这里的问题是,我要在EditCommentVC
的当前上下文中模态显示CommentVC
,因为我想将UIView
的背景设置为半透明。现在,在EditCommentVC
上,我有一个UITextView
,允许用户编辑他们的注释,以及两个按钮-cancel
(关闭EditCommentVC
)和{{1} },以更新新评论并将其推送到数据库。
就代码而言,一切工作正常,除了一旦推送新注释并取消update
时,EditCommentVC
上的UITableView
并没有所有注释重新加载以显示更新的评论。尝试从CommentsVC
调用它,但不起作用。
在这种情况下,如何重新加载viewWillAppear()
中的数据?
UITableView
@IBAction func updateTapped(_ sender: UIButton) {
guard let id = commentId else { return }
Api.Comment.updateComment(forCommentId: id, updatedComment: editTextView.text!, onSuccess: {
DispatchQueue.main.async {
let commentVC = CommentVC()
commentVC.tableView.reloadData()
self.dismiss(animated: true, completion: nil)
}
}, onError: { error in
SVProgressHUD.showError(withStatus: error)
})
}
中的代码在其中转换(并传递注释的CommentVC
)。 id
符合通过该评论的CommentVC
的{{1}}:
CommentActionProtocol
答案 0 :(得分:1)
我在这里看到至少 2个问题:
您正在创建一个新 CommentVC
,如果要在现有视图中更新tableView
,则不应该这样做控制器。
由于您已经提到Api.Comment.updateComment
是一个异步调用,因此您需要编写UI代码以在主线程上运行。
因此,首先需要在此viewController内部的变量中拥有commentVC
的实例。您可以从呈现此视图控制器的位置存储该视图控制器的实例。
class EditCommentVC {
var commentVCdelegate: CommentVC!
// Rest of your code
}
现在,当您呈现编辑视图控制器时,需要在此变量中传递引用commentVC。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "CommentVCToEditComment" {
let editCommentVC = segue.destination as! EditCommentVC
let commentId = sender as! String
editCommentVC.commentId = commentId
editCommentVC.commentVCdelegate = self
}
}
现在,您需要使用此引用来重新加载tableView。
Api.Comment.updateComment(forCommentId: id, updatedComment: editTextView.text!, onSuccess: {
DispatchQueue.main.async {
commentVCdelegate.tableView.reloadData() // - this commentVC must be an instance that you store of the your commentVC that you created the first time
self.dismiss(animated: true, completion: nil)
}
}, onError: { error in
SVProgressHUD.showError(withStatus: error)
})
答案 1 :(得分:0)
嗯,我也遇到了这个问题,我发现的解决方案是使用协议。我建议您搜索如何将数据发送回以前的ViewController 。这样,当您关闭EditCommentVC
时,然后将一个值(在我的情况下,我发送的是true)发送回上一个 ViewController(在您的情况下, CommentVC),然后您将在CommentVC中使用一个函数来检查该值是否为true,如果是,则重新加载TableView。
在这里,让我向您展示一个使用方法的示例(这些是我的ViewController,函数和协议的名称,您可以使用所需的任何内容,也可以将所需的任何数据发送回去):
在您的 CommentVC 中,您将看到以下内容:
protocol esconderBlurProtocol {
func isEsconder(value: Bool)
}
class PalestranteVC: UIViewController,esconderBlurProtocol {
func isEsconder(value: Bool) {
if(value){
//here is where you can call your api again if you want and reload the data
tableView.reloadData()
}
}
}
此外,别忘了您必须设置EditCommentVC的委托,因此在呈现EditCommentVC时要这样做,就像这样:
let viewController = (self.storyboard?.instantiateViewController(withIdentifier: "DetalhePalestranteVC")) as! DetalhePalestranteVC
viewController.modalPresentationStyle = .overFullScreen
viewController.delegate = self
self.present(viewController, animated: true, completion: nil)
//replace **DetalhePalestranteVC** with your **EditCommentVC**
在您的 EditCommentVC 中,您将看到以下内容:
class DetalhePalestranteVC: UIViewController {
var delegate: esconderBlurProtocol?
override func viewWillDisappear(_ animated: Bool) {
delegate?.isEsconder(value: true)
}
}
这样,您关闭 EditCommentVC 的所有内容,您将发回True并重新加载tableView。