2017-07-07 45 views
0

我正在尝试拍摄3张图片并将其发布到firebase存储中,并获取下载网址并将其放入Firebase数据库中。我的代码只上传第一张图片,但如果有第二张图片,则不会上传任何内容。Firebase上传图片并获取网址问题

@IBOutlet weak var titleText: UITextField! 
@IBOutlet weak var subtitleText: UITextField! 
@IBOutlet weak var authorText: UITextField! 
@IBOutlet weak var dateText: UITextField! 
@IBOutlet weak var articleText: UITextView! 
@IBOutlet weak var tagsText: UITextField! 
@IBOutlet weak var myImageView1: UIImageView! 
@IBOutlet weak var myImageView2: UIImageView! 
@IBOutlet weak var myImageView3: UIImageView! 
@IBOutlet weak var postType: UITextField! 
@IBOutlet weak var postStyle: UITextField! 

var ref:DatabaseReference? 

override func viewDidLoad() { 

    super.viewDidLoad() 
    ref = Database.database().reference() 

    let tapGestureRecognizer1 = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) 
    myImageView1.isUserInteractionEnabled = true 
    myImageView1.addGestureRecognizer(tapGestureRecognizer1) 
    let tapGestureRecognizer2 = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) 
    myImageView2.isUserInteractionEnabled = true 
    myImageView2.addGestureRecognizer(tapGestureRecognizer2) 
    let tapGestureRecognizer3 = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) 
    myImageView3.isUserInteractionEnabled = true 
    myImageView3.addGestureRecognizer(tapGestureRecognizer3)   

} 

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

var selected = 0 

func imageTapped(tapGestureRecognizer: UITapGestureRecognizer){ 
    let image = UIImagePickerController() 
    image.delegate = self 
    image.sourceType = UIImagePickerControllerSourceType.photoLibrary 
    image.allowsEditing = false 
    let tappedImage = tapGestureRecognizer.view as! UIImageView 
    selected = tappedImage.tag 
    self.present(image, animated: true) 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     if let myImageView1 = self.view.viewWithTag(selected) as? UIImageView { 
      myImageView1.image = image 
     } 
    } else { 
     //error 
    } 
    self.dismiss(animated: true, completion: nil) 
} 

@IBAction func upload(_ sender: Any) { 

    let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png") 

    if let uploadData = UIImagePNGRepresentation(self.myImageView1.image!) { 

     storageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in 

      let storageRef2 = Storage.storage().reference().child("images2/\(NSUUID().uuidString)/image2.png") 
      if let uploadData2 = UIImagePNGRepresentation(self.myImageView2.image!) { 

       storageRef2.putData(uploadData2, metadata: nil, completion: { (metadataSecond, error) in 

        if error != nil { 
         print("error") 
         return    
        } else { 
         let downloadURL = metadata?.downloadURL()?.absoluteString 
         let downloadURL2 = metadataSecond?.downloadURL()?.absoluteString 
            self.ref?.child("Posts").childByAutoId().setValue(["Title": self.titleText.text, "Subtitle": self.subtitleText.text, "Article": self.articleText.text, "Author": self.authorText.text, "Date": self.dateText.text, "Tags": self.tagsText.text, "PostType": self.postType.text, "PostStyle": self.postStyle.text, "Download URL": (downloadURL), "Download URL 2": (downloadURL2)]) 

        } 
        self.performSegue(withIdentifier: "segue321", sender: self) 

} 
+0

它看起来像是在'imagePickerController'函数中将图像分配给'myImageView1',但对其他UIImageViews没有任何位置。我可能会误解你在代码中选择图像的位置。 –

+0

那它应该是什么样子? – Riccardo

+0

在图像1上传关闭中放置一个断点。你的封闭被召唤了吗?如果是这样,它会在哪里失败,因为你的第二张图片没有上传? –

回答

1

如果我了解了您的图像浏览,看起来您有多个图像浏览,并且每个用户都可以从中选择图像。考虑到这一点,您当前的代码只处理一个案例,即myImageView1,但没有对myImageView2myImageView3执行处理。

1.可扩展解决方案

你需要做的就是把你的imageviews一个数组,然后遍历这个数组,并开始上传每个图像是什么。

PS:该代码不被测试,并旨在被用作参考

viewDidLoad()创建阵列保持你的imageviews如下所示

var imageViews: [UIImageView] 

override func viewDidLoad() 
{ 
    // After initializing them 
    imageViews = [myImageView1, myImageView2, myImageView3] 
} 

由于您有一个selected变量,用于跟踪被挖掘的imageView,我们也可以使用它来访问我们阵列中的相应视图,如下所示

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
{ 
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage 
    { 
     imageViews[selected].image = image 
    } 
    else 
    { 
     //error 
    } 
    self.dismiss(animated: true, completion: nil) 
} 

在您的upload中,您想遍历imageViews并开始上传各个图像。

@IBAction func upload(_ sender: Any) 
{ 
    let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png") 

    for imageView in imageViews 
    { 
     if let uploadData = UIImagePNGRepresentation(imageView.image) 
     { 
      // continue with your stuff 
     } 
     else 
     { 
      // Upload Data creation error 
     } 
    } 
} 

2.不可扩展

只要写多如果imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])语句占myImageView2myImageView3

两分钱:

我建议第一解决方案,因为它不受当前图像浏览次数的限制。如果您选择在将来添加更多内容,只需将其附加到数组即可。然而,第二种解决方案会导致多个if语句和复杂的代码。

编辑1错误发现

在上述实施方式中,它假定用户将选择在一个顺序中的所有图像视图即imageView1-> imageView2-> imageView3-> imageView4-> imageView5->等。如果用户选择imageView1-> imageView3-> imageView5

我们的阵列看起来像这样在上述情形:

[0]->[has image] 
[1]->[nil] 
[2]->[has image] 
[3]->[nil] 
[4]->[has image] 

的无段将导致到崩溃试图建立一个UIImagePNGRepresentation时。

上传前的简单图片存在检查将解决此问题。

@IBAction func upload(_ sender: Any) 
{ 
    let storageRef = Storage.storage().reference().child("images/\(NSUUID().uuidString)/image.png") 

    for imageView in imageViews 
    { 
     if imageView.image != nil 
     { 
      if let uploadData = UIImagePNGRepresentation(imageView.image) 
      { 
       // continue with your stuff 
      } 
      else 
      { 
       // upload data creation error 
      } 
     } 

    } 
} 
0

在上课开始的同时 尝试一下本作三个图像添加计数器

var counter: Int = 0 

,然后修改imagePickerController:`

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

    if counter == 0{ 
     if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      if let myImageView1 = self.view.viewWithTag(selected) as? UIImageView { 
       myImageView1.image = image 
       counter +=1 
      } 
     } else { 
      //error 
     } 
     } 
     else if counter==1{ 
      if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      if let myImageView2 = self.view.viewWithTag(selected) as? UIImageView { 
       myImageView2.image = image 
       counter+=1 
      } 
     } else { 
      //error 
     } 
     else{ 
     if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      if let myImageView3 = self.view.viewWithTag(selected) as? UIImageView { 
      myImageView3.image = image 
      counter = 0 
     } 
    } else { 
     //error 
    } 
    } 
    self.dismiss(animated: true, completion: nil) 
} 

我不知道它一次只能拍摄两张照片,但一次只能拍摄三张照片。对于其他情况,您应该自己尝试一下!

+0

如果我想添加第四个图像,我该怎么办? – Riccardo

+0

@ricardo像添加另一个图像视图和添加另一个图像的第四个图像?如果它的意思是你添加另一个如果有计数器== 3,当你实现第三个计数器到4 ...和第四个图像与旧的第三个图像相同,但你改变你的号码从3到4 – DionizB

+0

你能更新你的代码吗?谢谢! – Riccardo