我正在制作一个在我的应用中使用Firebase的Feed,但我无法创建允许用户删除帖子的内容。我尝试这样做的方法是创建一个UITableViewCell(称为“Post”)来处理每个单元格。我创建了一个协议,因此我可以在点击图像时在父视图控制器中显示警报,并在cellForRowAtIndexPath方法中将其作为自己的委托。警报会询问您是否确定要删除帖子。如果用户说“是”,我希望删除帖子,但是它没有这样做。当用户点击图像以删除帖子时,对firebase位置的引用将保存到NSUserDefaults。当用户从警报中点击“是”并且我调用removeValue()时,将检索该值...但是,该值未被删除。以下就是我所说的。
protocol Alert {
func showAlert()
}
class PostCell: UITableViewCell {
var delegate: Alert?
...
func deleteTapped(sender: UITapGestureRecognizer) {
defaults.setObject(String(self.postRef), forKey: "PostRef")
defaults.setObject(String(self.likeRef), forKey: "LikeRef")
self.delegate?.showAlert()
//self.postRef.removeValue()
//self.likeRef.removeValue()
}
...
}
//This is the parent ViewController
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let post = posts[indexPath.row]
if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell {
cell.delegate = self
cell.request?.cancel()
var img: UIImage?
if let url = post.imageURL {
img = FeedVC.imageCache.objectForKey(url) as? UIImage
}
cell.configureCell(post, img: img)
return cell
} else {
return PostCell()
}
}
func showAlert() {
let alert = UIAlertController(title: "Delete Post?", message: "Are you sure you want to delete the post?", preferredStyle: .Alert)
let no = UIAlertAction(title: "No", style: .Default, handler: nil)
let yes = UIAlertAction(title: "Yes", style: .Default) { alert in
self.postRef = Firebase(url: String(self.defaults.valueForKey("PostRef")))
self.likeRef = Firebase(url: String(self.defaults.valueForKey("LikeRef")))
print(self.postRef)
print(self.likeRef)
self.postRef.removeValue()
self.likeRef.removeValue()
self.tableView.reloadData()
}
alert.addAction(no)
alert.addAction(yes)
presentViewController(alert, animated: true, completion: nil)
}
如果我在UITableViewCell中的deleteTapped()方法中调用removeValue(),则会删除这些值,但这会在警告弹出之前询问用户是否确定要删除帖子。但是,当我在showAlert()('是'按下)方法中删除VALal()时没有任何反应。我打印了我要删除的引用的值,它们是正确的,但由于某种原因,Firebase没有获取删除它们的命令。
答案
所以我想出了我需要在这做什么。我意识到我需要将一个post对象传递给我的协议函数,如下所示:
protocol Alert {
func showAlert(post: Post)
}
然后我需要添加另一个类型为Post的变量(我称之为myPost)!在PostCell(这是我的UITableViewCell的名称)中,像这样:
var myPost: Post!
然后我需要通过查看viewController中的cellForRowAtIndexPath方法来获取myPost的值。我补充说:
cell.myPost = post
其中post是该给定单元格的对象。
然后,在我的deleteTapped方法(在我的UITableViewCell中)中,我将self.delegate?.showAlert()更改为:
self.delegate?.showAlert(myPost)
在这里,我基本上只是传递我在协议中声明的变量。
最后,我再次将我的viewController转到我的showAlert()方法。我需要将showAlert()更改为showAlert(post:Post),这是在我的协议中声明的。然后我只是在'yes'处理程序中创建了我的引用并删除了值,如下所示:
let postRef: Firebase = DataService.ds.REF_POSTS.childByAppendingPath(post.postKey)
let likeRef: Firebase = DataService.ds.REF_USER_CURRENT.childByAppendingPath("likes").childByAppendingPath(post.postKey)
postRef.removeValue()
likeRef.removeValue()