UIViewController被关闭时重新加载TableView?

时间:2018-08-21 17:58:22

标签: ios swift uitableview uiviewcontroller

这里的问题是,我要在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

2 个答案:

答案 0 :(得分:1)

我在这里看到至少 2个问题

  1. 您正在创建一个 CommentVC,如果要在现有视图中更新tableView,则不应该这样做控制器。

  2. 由于您已经提到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。