我的应用程序中有一个发布评论系统。用户点击reviewTableViewController中的review按钮,弹出一个当前模式页面,即postReviewController,他可以发布评论。在用户单击发送按钮后,我确定当前页面将被模式化地驳回,但现在用户刚刚写的帖子不会显示,直到我退出reviewTableViewController并再次打开它。
在关闭当前modally页面后,如何重新加载表视图?
我在点击reviewBtn时尝试了解除方法,但这取消了我需要执行的所有代码。
我的代码:
@IBAction func ReviewBtn(_ sender: Any) {
db.collection("Reviews").addDocument(data:[
//my code here
]){ err in
if let err = err {
print("Error writing document: (err)")
} else {
let messageVC = UIAlertController(title:
"Review submitted successfully!", message: "" , preferredStyle: .actionSheet)
self.present(messageVC, animated: true) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
messageVC.dismiss(animated: true) {
self.dismiss(animated: true, completion: nil)
}
}
}
}
}
}
对此有什么帮助或建议吗?
您可以在所提供的控制器中创建协议和协议的对象,如下所示
protocol DismissView{
func updateTblData()
}
var delegate: DismissView?
当您关闭视图时,调用委托的方法如下:
if let delegate = delegate {
delegate.updateTblData()
}
现在,在您显示屏幕的控制器中,请遵守协议并提供方法的定义。
此外,在出示控制器时,请将代表分配给自己,如下所示:
secondController.delegate = self
您展示的屏幕可能如下所示:
class FirstViewController: UIViewController , DismissView {
@IBOutlet weak var tbl: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func click(_ sender: Any) {
let controller = storyboard?.instantiateViewController(identifier: "new") as! NewViewController
controller.delegate = self
present(controller, animated: true)
}
func test() {
tbl.updateTblData()
}
}
基本上有两种方法可以做到这一点。
-
使用委托:其思想是
PostReviewController
应该调用ReviewTableViewController
中的方法,而不是仅将其自身驳回。在这种情况下,ReviewTableViewController
实例将关闭PostReviewController
控制器,并在关闭调用完成时调用reloadData。(只需在swift中搜索代表,你就会找到很多解决方案,帮助你解决问题。 -
使用闭包:基本上,您可以将闭包从
ReviewTableViewController
传递到PostReviewController
。在该闭包中,您将在完成时调用disease和reloadData,并且您的PostReviewController
实例将调用该闭包,而不是自行解除。
p.S.检查解雇的文档(动画:完成:(。理想情况下,呈现视图控制器应负责驳回其呈现的视图控制器