在Swift和Firebase中使用协议在UITableview中传递数据
问题描述:
我有一个名为PostsTableView的tableview,它有一个名为“Comment”的UIButton的用户帖子列表。当用户点击评论时,我希望它重定向到包含帖子周围所有信息的CommentViewController,例如postText和写帖子的用户。在Swift和Firebase中使用协议在UITableview中传递数据
下面的代码片段。
PostsTableView
extension PostsTableViewController: PostsTableViewCellDelegate {
func commentTapped(postInfo: String) {
//How do I pass postInfo along to CommentViewController
}
PostsTableViewCell
protocol TableViewCellDelegate {
func commentTapped(postInfo: String)
}
class PostsTableViewCell: UITableViewCell {
@IBOutlet weak var postTextLabel: UILabel!
@IBOutlet weak var postUserLabel: UILabel!
var postItem: Post!
var delegate: TableViewCellDelegate?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
@IBAction func commentAction(_ sender: Any) {
delegate?.commentTapped(postInfo: postItem.postText)
}
}
答
假设你正在使用塞格斯,你会打电话给.performSegue(withIdentifier: "mySegueIdentifier", sender: self)
您可以存储postInfo
先加入一个变量来PostsTableViewController
var selectedPostInfo: String?
然后将其设置在commentTapped(postInfo: String)
func commentTapped(postInfo: String) {
selectedPostInfo = postInfo
performSegue(withIdentifier: "mySegueIdentifier")
}
现在覆盖controller.prepare(for: UIStoryboardSegue, sender: Any?)
并设置CommentViewController
值:Firstof所有重构
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller = segue.destination as? CommentViewController {
controller.postInfo = selectedPostInfo
}
}
答
你可以做这样的事情
1)委托方法将post对象作为参数而不仅仅是String(这有助于提供更好的用户体验,因为不需要f刻蚀当时已有的本地数据)。这样
func commentTapped(postObject: Post) { // I am assuming your Post model has got all the info required by the CommentsViewController
}
2什么的)现在创建CommentsViewController属性假设后,你我可以初始化如下面的代码
func commentTapped(postObject: Post) {
let commentVC = CommentsViewController.initWithNib... // Initialise the Comments ViewController
commentVC.post = postObject // Assign the post object here
show(commentVC) // Present here the commentVC as per your requirement of Modal or Push
}