无法从VC控制器访问功能 - 无法在实例上使用类型
使用ImagePickerController创建带有图像上传器的Firebase表单。我正在尝试创建一个函数将照片上传到firebase并将uid存储到相关数据库。无法从VC控制器访问功能 - 无法在实例上使用类型
我在使用/访问函数时遇到了一些问题。
编译错误: - 实例构件 'uploadImageToFirebaseAndReturnImageURL' 不能在类型一起使用 '的DataService';你的意思是使用这种类型的值吗? - 实例成员'updateUserWithProfileImageURL'不能用于'DataService'类型;你的意思是使用这种类型的值吗?
的代码结构化控制器: “createActivityVC”,服务 “的DataService”,扩展名: “ImageUploader”
createActivityVC:
import UIKit
import Firebase
class createActivityVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func addPictureBtnWasPressed(_ sender: Any) {
imagePicker()
}
}
扩展:ImageUploader
import UIKit
extension createActivityVC: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
func imagePicker() {
let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var selectedImageFromPicker: UIImage?
if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
selectedImageFromPicker = editedImage
}
if let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
selectedImageFromPicker = originalImage
}
let uid = DataService.uploadImageToFirebaseAndReturnImageURL("profileimage", selectedImageFromPicker)
DataService.updateUserWithProfileImageURL()
}
func imagePickerCancelBtnWasPressed(picker: UIImagePickerController) {
print("Picker cancel button clicked")
self.dismiss(animated: true, completion: nil)
}
}
服务:DataServ冰
import Foundation
import Firebase
let DB_BASE = Database.database().reference() // gets the database URL from Firebase
let storage = Storage.storage() // Get a reference to the storage service using the default Firebase App
let DB_STORE = storage.reference() // Create a storage reference from our storage service
class DataService {
static let instance = DataService()
// static is used to make it a singleton class - meaning it is accessible to all other class
private var _REF_BASE = DB_BASE
private var _REF_USERS = DB_BASE.child("users")
private var _REF_CLUBS = DB_BASE.child("clubs")
private var _REF_ACTIVITY = DB_BASE.child("activities")
private var _REF_PROFILEIMAGES = DB_STORE.child("profileimages")
private var _REF_MEDIA = DB_STORE.child("media")
var REF_BASE: DatabaseReference {
return _REF_BASE
}
var REF_USERS: DatabaseReference {
return _REF_USERS
}
var REF_CLUBS: DatabaseReference {
return _REF_CLUBS
}
var REF_ACTIVITY: DatabaseReference {
return _REF_ACTIVITY
}
var REF_PROFILEIMAGES: StorageReference {
return _REF_PROFILEIMAGES
}
var REF_MEDIA: StorageReference {
return _REF_MEDIA
}
func uploadImageToFirebaseAndReturnImageURL(directory: String, image: UIImage!, handler: @escaping(_ imageURL: (ImageURL)) ->()) {
let imageName = NSUUID().uuidString // create unique image name
if let uploadData = UIImagePNGRepresentation(image) {
DB_STORE.child(directory).putData(uploadData, metadata: nil, completion: { (metadata, error) in
if error != nil {
print(error)
return
}
if let profileImageUrl = metadata?.downloadURL()?.absoluteString {
let d = ImageURL(imageURL: profileImageUrl)
handler (d)
}
return
})
}
}
func updateUserWithProfileImageURL(uid: String, imageURL: String){
REF_USERS.child(uid).child("profileImage").setValue(imageURL)
}
}
@Kqtr解释了你的代码有什么问题,但没有详细说明为什么它是错的。这里有一个更详细的解释:
您的DataService
类设置为单例:一个对象只创建一次。
语法DataService.someMethod()
用于调用一个类型方法 - 一个由类本身实现的方法,而不是类的某个实例。 (我喜欢命名为“类方法”,但苹果的文档称之为“类型的方法”。)
在你的方法将被宣布
class func uploadImageToFirebaseAndReturnImageURL()
但是,这种情况下,你的函数是一个实例函数。这是给您的DataService
类的某个实例的消息。
由于DataService
是一个单身人士,并且您有一个静态变量instance
来引用您的单身人士,您需要将您的代码更改为DataService.instance.uploadImageToFirebaseAndReturnImageURL()
。
你忘了打电话给你的共享实例。修改后的版本:
DataService.instance.uploadImageToFirebaseAndReturnImageURL(...
花一些时间来再次读取错误,并确保您理解它: 会遇到它下一次极大的帮助你!