Ios 我如何像在Instagram中那样添加评论,并允许其他用户对图片发表评论
嗨,在我的swift 3和firebase应用程序中发布图片时,我如何在图片实际发布之前添加评论?比如在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
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)
}