Ios 我如何像在Instagram中那样添加评论,并允许其他用户对图片发表评论

Ios 我如何像在Instagram中那样添加评论,并允许其他用户对图片发表评论,ios,swift,firebase,firebase-realtime-database,xcode8,Ios,Swift,Firebase,Firebase Realtime Database,Xcode8,嗨,在我的swift 3和firebase应用程序中发布图片时,我如何在图片实际发布之前添加评论?比如在Instagram中,我如何允许其他用户对其他人发布的图片发表评论?下面是我张贴的所有代码 后单元格 import UIKit import Firebase import FirebaseStorage import FirebaseDatabase import SwiftKeychainWrapper class PostCell: UITableViewCell { @IBOutl

嗨,在我的swift 3和firebase应用程序中发布图片时,我如何在图片实际发布之前添加评论?比如在Instagram中,我如何允许其他用户对其他人发布的图片发表评论?下面是我张贴的所有代码

后单元格

import UIKit
import Firebase
import FirebaseStorage
import FirebaseDatabase
import SwiftKeychainWrapper

class PostCell: UITableViewCell {

@IBOutlet weak var userImg: UIImageView!

@IBOutlet weak var username: UILabel!

@IBOutlet weak var postImg: UIImageView!

@IBOutlet weak var likesLbl: UILabel!

var post: Post!

var userPostKey: FIRDatabaseReference!

let currentUser = KeychainWrapper.standard.string(forKey: "uid")


override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

func configCell(post: Post, img: UIImage? = nil, userImg: UIImage? = nil) {

    self.post = post

    self.likesLbl.text = "\(post.likes)"

    self.username.text = post.username

    if img != nil {

        self.postImg.image = img

    } else {

        let ref = FIRStorage.storage().reference(forURL: post.postImg)
        ref.data(withMaxSize: 10 * 10000, completion: { (data, error) in

            if error != nil {

                print(error)

            } else {

                if let imgData = data {

                    if let img = UIImage(data: imgData){

                        self.postImg.image = img
                    }
                }
            }
        })
    }

    if userImg != nil {

        self.postImg.image = userImg

    } else {

        let ref = FIRStorage.storage().reference(forURL: post.userImg)
        ref.data(withMaxSize: 100000000, completion: { (data, error) in

            if error != nil {

                print("couldnt load img")

            } else {

                if let imgData = data {

                    if let img = UIImage(data: imgData){

                        self.userImg.image = img
                    }
                }
            }
        })
    }

    _ = FIRDatabase.database().reference().child("users").child(currentUser!).child("likes").child(post.postKey)
}

@IBAction func liked(_ sender: Any) {

    let likeRef = FIRDatabase.database().reference().child("users").child(currentUser!).child("likes").child(post.postKey)

    likeRef.observeSingleEvent(of: .value, with:  { (snapshot) in

        if let _ = snapshot.value as? NSNull {

            self.post.adjustLikes(addlike: true)

            likeRef.setValue(true)

        } else {

            self.post.adjustLikes(addlike: false)

            likeRef.removeValue()
        }
    })
}
}
FeedVC

import UIKit
import Firebase
import FirebaseDatabase
import FirebaseStorage
import SwiftKeychainWrapper
import CoreImage

class FeedVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var tableView: UITableView!

@IBOutlet weak var postBtn: UIButton!

var posts = [Post]()

var post: Post!

var imagePicker: UIImagePickerController!

var imageSelected = false

var selectedImage: UIImage!

var userImage: String!

var userName: String!

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self

    tableView.dataSource = self

    imagePicker = UIImagePickerController()

    imagePicker.allowsEditing = true

    imagePicker.delegate = self




    FIRDatabase.database().reference().child("posts").observe(.value, with: {(snapshot) in

        if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {

            self.posts.removeAll()

            for data in snapshot {

                print(data)

                if let postDict = data.value as? Dictionary<String, AnyObject> {

                    let key = data.key

                    let post = Post(postKey: key, postData: postDict)

                    self.posts.append(post)
                }
            }
        }

        self.tableView.reloadData()
    })
}



func numberOfSections(in tableView: UITableView) -> Int {

    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return posts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let post = posts[indexPath.row]

    if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell") as? PostCell {

        cell.configCell(post: post)

        return cell

    } else {

        return PostCell()
    }
}

override var preferredStatusBarStyle : UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {

        selectedImage = image

        imageSelected = true

    } else {

        print("A valid image wasnt selected")
    }
    imagePicker.dismiss(animated: true, completion: nil)

    guard imageSelected == true else {

        print("An image must be selected")

        return
    }

    if let imgData = UIImageJPEGRepresentation(selectedImage, 0.2) {

        let imgUid = NSUUID().uuidString

        let metadata = FIRStorageMetadata()

        metadata.contentType = "image/jpeg"

        FIRStorage.storage().reference().child("post-pics").child(imgUid).put(imgData, metadata: metadata) { (metadata, error) in

            if error != nil {

                print("image did not save to firebase storage")

            } else {

                print("uploded to firebase storage")

                let downloadURL = metadata?.downloadURL()?.absoluteString

                if let url = downloadURL {

                    self.postToFirebase(imgUrl: url)
                }
            }
        }
    }
}

func postToFirebase(imgUrl: String) {

    let userID = FIRAuth.auth()?.currentUser?.uid

    FIRDatabase.database().reference().child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in

        let data = snapshot.value as! Dictionary<String, AnyObject>

        let username = data["username"]

        let userImg = data["userImg"]

        let post: Dictionary<String, AnyObject> = [
            "username": username as AnyObject,
            "userImg": userImg as AnyObject,
            "imageUrl": imgUrl as AnyObject,
            "likes": 0 as AnyObject
        ]

        let firebasePost = FIRDatabase.database().reference().child("posts").childByAutoId()

        firebasePost.setValue(post)

        self.imageSelected = false

        self.tableView.reloadData()

    }) { (error) in

        print(error.localizedDescription)
    }
}

@IBAction func postImageTapped(_ sender: AnyObject)
{

        let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in
           self.openCamera()
        }))

        alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in
           self.openGallary()
        }))

        alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))

        self.present(alert, animated: true, completion: nil)
    }

    func openCamera()
    {
        if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.camera))
        {
            imagePicker.sourceType = UIImagePickerControllerSourceType.camera
            imagePicker.allowsEditing = true
            self.present(imagePicker, animated: true, completion: nil)
        }
        else
        {
            let alert  = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }

    func openGallary()
    {
        imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
        imagePicker.allowsEditing = true
        self.present(imagePicker, animated: true, completion: nil)
    }


@IBAction func SignOutPressed(_ sender: AnyObject) {

    try! FIRAuth.auth()?.signOut()

    KeychainWrapper.standard.removeObject(forKey: "uid")

    dismiss(animated: true, completion: nil)
}
}
导入UIKit
进口火基
导入FirebaseDatabase
导入FirebaseStorage
导入快捷键链包装器
导入CoreImage
类FeedVC:UIViewController、UITableViewDelegate、UITableViewDataSource、UIImagePickerControllerDelegate、UINavigationControllerDelegate{
@IBVAR表格视图:UITableView!
@IBOUTLE弱var postBtn:UIButton!
var posts=[Post]()
var post:post!
var imagePicker:UIImagePickerController!
var imageSelected=false
var selectedImage:UIImage!
var userImage:String!
var用户名:String!
重写func viewDidLoad(){
super.viewDidLoad()
tableView.delegate=self
tableView.dataSource=self
imagePicker=UIImagePickerController()
imagePicker.allowsEditing=true
imagePicker.delegate=self
FIRDatabase.database().reference().child(“posts”).observe(.value,其中:{(快照)位于
如果让snapshot=snapshot.children.allObjects为?[FIRDataSnapshot]{
self.posts.removeAll()
对于快照中的数据{
打印(数据)
如果让postDict=data.value作为字典{
让key=data.key
让post=post(postKey:key,postData:postDict)
self.posts.append(post)
}
}
}
self.tableView.reloadData()
})
}
func numberOfSections(在tableView:UITableView中)->Int{
返回1
}
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回岗位数
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让post=posts[indexPath.row]
如果let cell=tableView.dequeueReusableCell(标识符为“PostCell”)为?PostCell{
cell.configCell(post:post)
返回单元
}否则{
返回邮政编码()
}
}
重写变量preferredStatusBarStyle:UIStatusBarStyle{
返回UIStatusBarStyle.lightContent
}
func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo:[字符串:任意]){
如果让image=info[UIImagePickerControllerEditedImage]作为?UIImage{
选择图像=图像
imageSelected=true
}否则{
打印(“未选择有效图像”)
}
imagePicker.Disclose(动画:true,完成:nil)
所选保护图像==真值{
打印(“必须选择图像”)
返回
}
如果让imgData=UIImageJPEG表示(选择图像,0.2){
让imgUid=nsuid().uuidString
let metadata=FIRStorageMetadata()
metadata.contentType=“图像/jpeg”
FIRStorage.storage().reference().child(“post pics”).child(imgUid).put(imgData,metadata:metadata){(metadata,error)in
如果错误!=nil{
打印(“图像未保存到firebase存储”)
}否则{
打印(“上传到firebase存储”)
让downloadURL=元数据?.downloadURL()?.absoluteString
如果let url=downloadURL{
self.postToFirebase(imgUrl:url)
}
}
}
}
}
func postToFirebase(imgUrl:String){
让userID=FIRAuth.auth()?.currentUser?.uid
FIRDatabase.database().reference().child(“用户”).child(用户ID!).observeSingleEvent(的值为:),其中:{(快照)位于
设data=snapshot.value为!字典
让用户名=数据[“用户名”]
让userImg=data[“userImg”]
let post:字典=[
“用户名”:作为任何对象的用户名,
“userImg”:userImg作为任何对象,
“imageUrl”:imgUrl作为任何对象,
“喜欢”:0作为任何对象
]
让firebasePost=FIRDatabase.database().reference().child(“posts”).childByAutoId()
firebasePost.setValue(post)
self.imageSelected=false
self.tableView.reloadData()
}){(错误)在
打印(错误。本地化描述)
}
}
@iAction func postImageTapped(\发送方:任何对象)
{
let alert=UIAlertController(标题:“选择图像”,消息:nil,首选样式:。操作表)
addAction(UIAlertAction)(标题:“摄影机”,样式:。默认值,处理程序:{in
self.openCamera()
}))
addAction(UIAlertAction)(标题:“Gallery”,样式:。默认值,处理程序:{in
self.openGallary()
}))
addAction(UIAlertAction.init(标题:“取消”,样式:。取消,处理程序:nil))
self.present(警报、动画:true、完成:nil)
}
func openCamera()
{
if(UIImagePickerController.IsSourceType可用(UIImagePickerController源类型.camera))
{
imagePicker.sourceType=UIImagePickerControllerSourceType.camera
imagePicker.allowsEditing=true
自我呈现(imagePicker,动画:true,完成:nil)
}
其他的
{
let alert=UIAlertController(标题:“警告”,消息:“您没有摄像头”,首选样式:。警报)
addAction(UIAlertAction(标题:“确定”,样式:。默认,处理程序:nil))
self.present(警报、动画:true、完成:nil)
}
}
func openGallary()
{
imagePicker.sourceType=UIImagePickerControllerSourceType.photoLibrary
imagePicker.allowsEditing=true
自我呈现(imagePicker,动画:true,完成:nil)
}
@iAction func SignOutPressed(\发送方:AnyObject){
试试!FIRAuth.auth()?.signOut()
KeychainWrapper.standard.removeObject(forKey
import Foundation
import Firebase
import FirebaseDatabase

class Post {
private var _username: String!
private var _userImg: String!
private var _postImg: String!
private var _likes: Int!
private var _postKey:  String!
private var _postRef: FIRDatabaseReference!

var username: String {
    return _username
}

var userImg: String {
    return _userImg
}

var postImg: String {
    get {
        return _postImg
    } set {
        _postImg = newValue
    }
}

var likes: Int {
    return _likes
}

var postKey: String {
    return _postKey
}

init(imgUrl: String, likes: Int, username: String, userImg: String) {
    _likes = likes
    _postImg = imgUrl
    _username = username
    _userImg = userImg
}

init(postKey: String, postData: Dictionary<String, AnyObject>) {
    _postKey = postKey

    if let username = postData["username"] as? String {
        _username = username
    }

    if let userImg = postData["userImg"] as? String {
        _userImg = userImg
    }

    if let postImage = postData["imageUrl"] as? String {
        _postImg = postImage
    }

    if let likes = postData["likes"] as? Int {
        _likes = likes
    }

    _postRef = FIRDatabase.database().reference().child("posts").child(_postKey)

}

func adjustLikes(addlike: Bool) {
    if addlike {
        _likes = likes + 1
    } else {
        _likes = likes - 1
    }
    _postRef.child("likes").setValue(_likes)
}