2016-05-15 24 views
1

基本上,我尝试在桌面视图中尝试更改Firebase中的值时遇到一些困难。我目前正在尝试制作一个类似Facebook的帖子,让人们喜欢你的帖子。但是,我不太清楚我将如何继续这项工作。我想让用户能够喜欢每篇文章,然后保存之前的喜欢+喜欢的文章,并将其更新到firebase中。截至目前,我只有代码显示每个帖子,还有按钮的@IBAction(Like按钮)。Swift/Firebase从表格视图中更改值

我不知道我将如何通过使用indexPath.row(?)来访问每个特定帖子,只通过表视图。这里是我到目前为止的代码:

帖子编辑:

所以基本上我有一个tableview中,包含显示喜欢每个岗位都有量的表视图单元格。要做到这一点,我有这样的代码在我viewDidLoad中(),刚刚从火力地堡获取数据:

ref.childByAppendingPath("posts").queryOrderedByChild("timeRegistered").observeEventType(FEventType.ChildAdded) { (snapshot:FDataSnapshot!) in 

     var dict = [String:String]() 
     dict["keys"] = snapshot.key as? String 
     dict["votes"] = snapshot.value["likes"] as? String 
     self.posts.append(dict) 

     self.tableView.reloadData() 


    } 

仅举,此代码的工作,通过在的cellForRowAtIndexPath使用此代码:cell.textLabel!.text = String(posts[indexPath.row]["names"]!)

但是,我认为,我在viewDidLoad中(.ChildAdded功能)使用的代码将与ChildChanged工作一样,所以这是我想出了:

ref.childByAppendingPath("posts").queryOrderedByChild("timeRegistered").observeEventType(FEventType.ChildChanged) { (snapshot:FDataSnapshot!) in 

     var dict = [String:String]() 
     dict["keys"] = snapshot.key as? String 
     dict["votes"] = snapshot.value["votes"] as? String 
     self.posts.append(dict) 

     self.tableView.reloadData() 


    } 

不幸的是,它看起来像的tableview只显示新值(值从IBAction,我也会提供这些代码。) - 虽然旧值只停留在那里。这是一个不断变化的值的代码:

var key = posts[1]["keys"] 
    ref.childByAppendingPath("posts").childByAppendingPath(key!).updateChildValues(["name":"Test name"]) 
    tableView.reloadData() 

仍试图找出变化的精确值,通过指数的一个更好的方式 - 但事实并非如此,现在(因此帖[1] [“钥匙”] )。你好像明白问题是什么?总结:我想单击一个表格视图单元格内的按钮,并向特定的帖子中添加一个像,并实时更新总数。

+1

这是一个有点不清楚你想要做什么;还有,界面是什么?是“票”还是“喜欢”同一件事?一个简单的解决方案就是在每行上按一下+按钮,当用户点击+时,就会增加投票/赞成。你知道它通过clickedRow是哪一行,或者可能有处理点击的自定义单元格。 – Jay

+0

所以基本上我想添加'likes'函数,就像你可以称之为的那样 - 我想要它在按'like'后立即更新记录(旧的喜欢+ 1个新的类似)。 – askaale

+0

我这么认为......不要过于复杂。只需点击一个+按钮即可获得IBAction。确定哪一行被点击,然后从你的帖子数组[clickedRow]中获取当前喜欢的,增加喜欢,然后通过Firebase Key和那个行的子节点likes.setValue(votes)更新Firebase中的值。 – Jay

回答

2

有多个答案,所以这里有几件事:

ChildChanged事件是一个问题。当一个孩子被改变时,你的代码将它附加到数组上,创建一个具有不同数据的重复子代。你应该做的是确定它是哪个孩子,从数组中获取该词典并用新值更新值。

后续评论询问'你怎么做'。

取决于您希望如何存储数据,有很多方法可以实现。我将给出两个示例:

假设您有一个包含有关每个帖子的信息的Post结构(对象)。这是比字典更好的解决方案。该结构将包含火力键,味精和发的帖子的用户的uid和你存储这些帖子在postsArray

struct Post { 
    var firebaseKey : String? 
    var msg: String? 
    var uid: String? 

    init(aFirebaseKey: String, aMsg: String, aUid: String) { 
     self.firebaseKey = aFirebaseKey 
     self.msg = aMsg 
     self.uid = aUid 
    } 
} 

var postsArray = [Post]() 

,并假设你正在观察更改职位节点:

postsRef.observeEventType(.ChildChanged, withBlock: { snapshot in 
    let changedKey = snapshot.key //the firebase key 
    if let index = self.postsArray.indexOf({$0.firebaseKey == changedKey}) { 
    print(index) //index is the index of the Post in the array 
    let changedPost = self.postsArray[index] 
    //update the values 
    self.tableView.reloadData 
} 

,并使其完整,岗位

postsRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 

    let theKey = child.key as String 
    let theMsg = child.value["msg"] as! String 
    let theUid = child.value["user"] as! String 

    let p = Post(aFirebaseKey: theKey, aMsg: theMsg, aUid: theUid) 

    self.postsArray.append(p)    
    } 
}) 

另一种选择是并排排列,以保持侧的初始加载。

keysArray[String]() 
valuesArray[Dictionary]() 

使用类似的代码,在childChanged事件而得到火力键,然后简单地找到keysArray内的关键,这将返回它的索引。然后使用返回的索引从valuesArray获取值;更新它们并重新加载桌面视图。

let index= keysArray.indexOf(firebaseKey) //get the index for this post 

let postToUpdate = self.valuesArray[index] 
//update the Post 

当然最初的时候加载数组,你把keysArray键和值在valuesArray

相关问题