使用UITableViewCell时无法删除Firebase参考

时间:2016-04-04 16:06:13

标签: ios swift uitableview firebase

我正在制作一个在我的应用中使用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()

0 个答案:

没有答案