Ios 尝试将多个图像上载到Firebase:SWIFT 4、Firebase 5.0.0中出现2个错误
我正在制作一个与Instagram的多图像post功能非常相似的项目,由于我的ImageUploadManager,我的capturePhotoController中有两个错误相互连接。错误是: 无法分配给“ImageUploadManager.type”类型的不可变表达式 类型“ImageUploadManager”没有成员“uploadImage” 此视图控制器中正在发生:*错误用注释标记Ios 尝试将多个图像上载到Firebase:SWIFT 4、Firebase 5.0.0中出现2个错误,ios,swift,xcode,firebase,error-handling,Ios,Swift,Xcode,Firebase,Error Handling,我正在制作一个与Instagram的多图像post功能非常相似的项目,由于我的ImageUploadManager,我的capturePhotoController中有两个错误相互连接。错误是: 无法分配给“ImageUploadManager.type”类型的不可变表达式 类型“ImageUploadManager”没有成员“uploadImage” 此视图控制器中正在发生:*错误用注释标记 import UIKit class takePicViewController: UIViewCo
import UIKit
class takePicViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var imageView: UIImageView!
let imagePicker = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
imagePicker.delegate = self
imagePicker.sourceType = .camera
imagePicker.allowsEditing = false
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
// Error ImageUploadManager = ImageUploadManager()
// Error ImageUploadManager?.uploadImage(userPickedImage, progressBlock: { (percentage) in
print(percentage)
}, completionBlock: { (fileURL, errorMessage) in
print(fileURL)
print(errorMessage)
})
PhotoArray.sharedInstance.photosArray.append(userPickedImage) //append converted data in array
imageView.image = userPickedImage
}
imagePicker.dismiss(animated: true, completion: nil)
}
@IBAction func cameraButtonPressed(_ sender: UIButton) {
present(imagePicker, animated: true, completion: nil)
}
}
以下是ImageUploadManager的代码:
import UIKit
import FirebaseStorage
import Firebase
struct Constants {
struct Car {
static let imagesFolder: String = "carImages"
}
}
class ImageUploadManager: NSObject {
func uploadImage(_ image: UIImage, /**/ progressBlock: @escaping (_ percentage: Double) -> Void, /**/ completionBlock: @escaping (_ url: String?, _ errorMessage: String?) -> Void) {
let data = Data()
let storage = Storage.storage()
let storageRef = storage.reference()
let imageName = "\(Date().timeIntervalSince1970).jpg"
let imagesReference = storageRef.child(Constants.Car.imagesFolder).child(imageName)
if let imageData = UIImageJPEGRepresentation(image, 0.8) {
let metadata = storageRef.child("image/jpg")
let uploadTask = metadata.putData(data, metadata: nil) { (metadata, error) in
guard let metadata = metadata else {
// Uh-oh, an error occurred!
return
}
storageRef.downloadURL { (url, error) in
guard let downloadURL = url else {
// Uh-oh, an error occurred!
return
}
}
}
uploadTask.observe(.progress, handler: { (snapshot) in
guard let progress = snapshot.progress else {
return
}
let percentage = (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) * 100
progressBlock(percentage)
})
} else {
completionBlock(nil, "Image could not be converted to Data.")
}
}
}
是注释代码:
//错误ImageUploadManager=ImageUploadManager()
您的ImageUploadManager
声明?如果是这样的话,那是完全错误的。应声明如下:
if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
let imageUploadManager = ImageUploadManager()
imageUploadManager.uploadImage(userPickedImage, prog.....
阅读ImageUploadManager
时,它看起来像是一个无状态对象,您可以将函数声明为类
函数
`class func uploadImage(_ image: UIImage`......`
然后,您可以将其称为:
if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
ImageUploadManager.uploadImage(userPickedImage, prog.....
这一行没有什么意义:
ImageUploadManager=ImageUploadManager()
。左边应该是一个变量名,您将对象归因于类名。我使用了您的解决方案,现在出现了以下错误:无法对“ImageUploadManager”类型的非可选值使用可选链接,该值发生在“ImageUploadManager?”行中。uploadImage(userPickedImage,…”您提供的第一个解决方案代码的。您想在anwser中查看更新后的代码,还是希望从该评论中获得足够的信息?@StackOverflow更新了答案。我建议您阅读更多关于swift的信息。事实上,我对根据您的答案实现的代码进行了一些更改,并且似乎有效。谢谢!