2017-10-20 21 views
0

使用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) 
} 




} 

回答

0

@Kqtr解釋了你的代碼有什麼問題,但沒有詳細說明爲什麼它是錯的。這裏有一個更詳細的解釋:

您的DataService類設置爲單例:一個對象只創建一次。

語法DataService.someMethod()用於調用一個類型方法 - 一個由類本身實現的方法,而不是類的某個實例。 (我喜歡命名爲「類方法」,但蘋果的文檔稱之爲「類型的方法」。)

在你的方法將被宣佈

class func uploadImageToFirebaseAndReturnImageURL()

但是,這種情況下,你的函數是一個實例函數。這是給您的DataService類的某個實例的消息。

由於DataService是一個單身人士,並且您有一個靜態變量instance來引用您的單身人士,您需要將您的代碼更改爲DataService.instance.uploadImageToFirebaseAndReturnImageURL()

0

你忘了打電話給你的共享實例。修改後的版本:

DataService.instance.uploadImageToFirebaseAndReturnImageURL(... 

花一些時間來再次讀取錯誤,並確保您理解它: 會遇到它下一次極大的幫助你!