2016-05-15 2 views
1

В основном я испытываю некоторые трудности, пытаясь изменить значение из Firebase в виде таблицы. В настоящее время я пытаюсь создать функцию Facebook-post-like, позволяющую людям понравиться ваш пост. Однако я не совсем уверен, как я буду продолжать это. Я хочу дать пользователю возможность понравиться каждому сообщению, а затем сохранить предыдущие понравившиеся + подобные, которые были предоставлены, и обновить его в firebase. На данный момент у меня есть только код для отображения каждого сообщения, а также @IBAction от кнопки (как кнопка).Swift/Firebase change value from tableview

Я не уверен, как мне удастся получить доступ к каждому конкретному сообщению через только табличное представление, используя indexPath.row (?). Вот код, который я до сих пор:

Сообщения редактирование:

Так в основном у меня есть TableView, содержащий ячейку просмотра таблицы, которая отображает количество подобных каждому пост имеет. Чтобы сделать это, у меня есть этот код в моем viewDidLoad(), чтобы просто извлечь данные из Firebase:

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 просто отображает новое значение (значение, измененное с IBActi я также предоставлю этот код.) - в то время как старое значение остается там. Это код для изменения значения:

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

Тем не менее, пытаясь выяснить, лучший способ изменить точное значение, с помощью индекса - но это не происходит сейчас (поэтому сообщения [1] [ «ключи»]). Кажется, вы понимаете, в чем проблема?

Подводя итог: хочу щелкнуть по кнопке внутри ячейки таблицы просмотра и добавить понравившиеся сообщения к конкретному сообщению и обновить общее количество в реальном времени.

+1

Это немного неясно, что вы пытаетесь сделать; а также, какой интерфейс? «Голоса» и «нравится» то же самое? Одним простым решением будет кнопка «+» на каждой строке, а когда пользователь нажимает кнопку «+», это увеличивает голоса/понравится. Вы знаете, в какой строке это щелкнуть кнопкой мыши или, возможно, создать пользовательскую ячейку, которая обрабатывает клик. – Jay

+0

Итак, в основном я хочу добавить функцию «любит», как вы можете ее назвать, - и я хочу, чтобы она обновляла записи сразу после нажатия «like» (старый нравится + 1 новый, как). – askaale

+0

Думаю, что так ... Не переусердствуйте. Просто имейте IBAction, который отвечает на нажатие кнопки +. Определите, какая строка была нажата, затем получите текущие симпатии из вашего массива сообщений [clickedRow], увеличивайте количество понравившихся, а затем обновите значение в Firebase с помощью ключа firebase для этой строки и дочернего узла like.setValue (голосов). – Jay

ответ

2

Есть несколько ответов, так вот несколько вещей:

Событие ChildChanged это один вопрос. Когда ребенок изменен, ваш код добавляет его в массив, создавая дубликат ребенка с разными данными. То, что вы должны делать, это определить, какой именно ребенок, получить этот словарь из массива и обновить значения с новыми значениями.

В последующих комментариях спрашивается, «как вы это делаете».

Есть несколько способов добраться до него в зависимости от того, как вы хотите хранить свои данные. Я приведу два примера:

Предположим, что у вас есть структура Post (объект), которая содержит информацию о каждом сообщении. Это лучшее решение, чем работа со словарями.Структура будет содержать firebase ключ, ГЗС и 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 получить firebase ключ, а затем просто найти этот ключ в пределах keysArray, который вернет его в индекс. Затем используйте возвращаемый индекс, чтобы получить значения из значенийArray; обновить их и перезагрузить Tableview.

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

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

Конечно, когда первоначально загрузки массивов, вы положили ключи в keysArray и значения в valuesArray