vendoo_v1.0/Pods/Firebase/Samples/database/DatabaseExampleSwift/PostDetailTableViewController.swift

163 lines
5.6 KiB
Swift

//
// Copyright (c) 2015 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import UIKit
import Firebase
@objc(PostDetailTableViewController)
class PostDetailTableViewController: UITableViewController {
let kSectionSend = 2
let kSectionComments = 1
let kSectionPost = 0
var postKey = ""
var comments: Array<FIRDataSnapshot> = []
var commentField: UITextField? = nil
let post: Post = Post()
lazy var ref: FIRDatabaseReference = FIRDatabase.database().reference()
var postRef: FIRDatabaseReference!
var commentsRef : FIRDatabaseReference!
var refHandle: FIRDatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
postRef = ref.child("posts").child(postKey)
commentsRef = ref.child("post-comments").child(postKey)
let nib = UINib(nibName: "PostTableViewCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "post")
}
override func viewWillAppear(animated: Bool) {
comments.removeAll()
// [START child_event_listener]
// Listen for new comments in the Firebase database
commentsRef.observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
self.comments.append(snapshot)
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.comments.count-1, inSection: 1)], withRowAnimation: UITableViewRowAnimation.Automatic)
})
// Listen for deleted comments in the Firebase database
commentsRef.observeEventType(.ChildRemoved, withBlock: { (snapshot) -> Void in
let index = self.indexOfMessage(snapshot)
self.comments.removeAtIndex(index)
self.tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: 1)], withRowAnimation: UITableViewRowAnimation.Automatic)
})
// [END child_event_listener]
// [START post_value_event_listener]
refHandle = postRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
let postDict = snapshot.value as! [String : AnyObject]
// [START_EXCLUDE]
self.post.setValuesForKeysWithDictionary(postDict)
self.tableView.reloadData()
self.navigationItem.title = self.post.title
// [END_EXCLUDE]
})
// [END post_value_event_listener]
}
func indexOfMessage(snapshot: FIRDataSnapshot) -> Int {
var index = 0
for comment in self.comments {
if (snapshot.key == comment.key) {
return index
}
index += 1
}
return -1
}
override func viewWillDisappear(animated: Bool) {
if let refHandle = refHandle {
postRef.removeObserverWithHandle(refHandle)
}
commentsRef.removeAllObservers()
}
// UITableViewDataSource protocol methods
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 3
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case kSectionPost, kSectionSend:
return 1
case kSectionComments:
return comments.count
default:
return 0
}
}
@IBAction func didTapSend(sender: AnyObject) {
let uid = FIRAuth.auth()?.currentUser?.uid
FIRDatabase.database().reference().child("users").child(uid!).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
if let uid = uid, commentField = self.commentField, user = snapshot.value as? [String : AnyObject] {
let comment = [
"uid": uid,
"author": user["username"] as! String,
"text": commentField.text!
]
self.commentsRef.childByAutoId().setValue(comment)
commentField.text = ""
}
})
}
override func tableView(tableView: UITableView,
cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell
switch indexPath.section {
case kSectionPost:
cell = tableView.dequeueReusableCellWithIdentifier("post")!
if let uid = FIRAuth.auth()?.currentUser?.uid {
let postcell = cell as! PostTableViewCell
let imageName = post.stars == nil || post.stars![uid] == nil ? "ic_star_border" : "ic_star"
postcell.authorLabel.text = post.author
postcell.postTitle.text = post.title
postcell.postBody.text = post.body
postcell.starButton.setImage(UIImage(named: imageName), forState: .Normal)
if let starCount = post.starCount {
postcell.numStarsLabel.text = "\(starCount)"
}
postcell.postKey = postKey;
}
case kSectionComments:
cell = tableView.dequeueReusableCellWithIdentifier("comment")!
let commentDict = comments[indexPath.row].value as! [String : AnyObject]
if let text = cell.textLabel, detail = cell.detailTextLabel,
author = commentDict["author"], commentText = commentDict["text"] {
detail.text = String(author)
text.text = String(commentText)
}
default: // kSectionSend
cell = tableView.dequeueReusableCellWithIdentifier("send")!
commentField = cell.viewWithTag(7) as! UITextField?
break
}
return cell
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if indexPath.section == kSectionPost {
return 160
}
return 56
}
}