2017-01-13 9 views
0

NB: Это не повторение вопроса, я посмотрел на другие решения, но ни один из них работает в Swift 3, но они делают в Swift 2.Swift 3 Послать изображение CloudKit с CKAsset

Мне нужно, чтобы получить образ из библиотеки фотографий с UIImagePickerController, который работает отлично, то мне нужно сделать это, чтобы каким-то образом сохранить это в общедоступной записи в CloudKit, я очень открыт относительно того, как это делается. Пожалуйста, по возможности, уточните, что мне нужно изменить/добавить и где.

Я предоставил весь файл контроллера для просмотра, чтобы быть уверенным.

импорт UIKit импорт CloudKit

вар электронная почта: String = ""

класс ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

//MARK: Properties 

@IBOutlet weak var firstNameField: UITextField! 
@IBOutlet weak var lastNameField: UITextField! 
@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var passwordField: UITextField! 
@IBOutlet weak var confirmPasswordField: UITextField! 
@IBOutlet weak var notMatching: UILabel! 
@IBOutlet weak var emailLabel: UILabel! 
@IBOutlet weak var errorLabel: UILabel! 

@IBOutlet weak var photoImageView: UIImageView! 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    self.firstNameField.autocorrectionType = .no 
    self.lastNameField.autocorrectionType = .no 
    self.emailField.autocorrectionType = .no 
    self.passwordField.autocorrectionType = .no 
    self.confirmPasswordField.autocorrectionType = .no 
    self.notMatching.isHidden = true 

    firstNameField.delegate = self 
    lastNameField.delegate = self 
    emailField.delegate = self 
    passwordField.delegate = self 
    confirmPasswordField.delegate = self 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

//MARK: UIImagePickerControllerDelegate 

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 

    // Dismiss the picker if the user canceled. 
    dismiss(animated: true, completion: nil) 

} 

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

    // The info dictionary may contain multiple representations of the image. You want to use the original. 
    guard let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else { 
     fatalError("Expected a dictionary containing an image, but was provided the following: \(info)") 
    } 

    // Set photoImageView to display the selected image. 
    photoImageView.image = selectedImage 



    // Dismiss the picker. 
    dismiss(animated: true, completion: nil) 


} 


//MARK: Actions 

@IBAction func selectImageFromPhotoLibrary(_ sender: UITapGestureRecognizer) { 

    //Hide keyboards 
    firstNameField.resignFirstResponder() 
    lastNameField.resignFirstResponder() 
    emailField.resignFirstResponder() 
    passwordField.resignFirstResponder() 
    confirmPasswordField.resignFirstResponder() 

    let imagePickerController = UIImagePickerController() 

    imagePickerController.sourceType = .photoLibrary 


    imagePickerController.delegate = self 
    present(imagePickerController, animated: true, completion: nil) 

} 



@IBAction func signUpPressed(_ sender: UIButton) { 

    let container = CKContainer.default() 
    let pubDB = container.publicCloudDatabase 
    //let privDB = container.privateCloudDatabase 

    //Check if users exist 
    let query = CKQuery(recordType: "MyUsers", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)) 
    pubDB.perform(query, inZoneWith: nil, completionHandler: { (records, error) in 

     //error code 11 is no objects found 
     if error == nil || error?._code == 11 { 

      var emailExists = false 

      for record in records! { 

       if record.object(forKey: "email") as? String == self.emailField.text { 
        //other user with the same username exists - don't allow user to create account 
        emailExists = true 

       } 

      } 

      if emailExists == true { 


       self.emailLabel.text = "\(self.emailField.text!) is taken. Please choose another one." 

      } else { 

       if self.firstNameField.text != nil && self.lastNameField.text != nil && self.passwordField.text == self.confirmPasswordField.text { 

        //user can sign up 


        let record = CKRecord(recordType: "MyUsers") 
        record.setObject(self.emailField.text! as CKRecordValue?, forKey: "email") 
        record.setObject(self.passwordField.text! as CKRecordValue?, forKey: "password") 
        record.setObject(self.firstNameField.text! as CKRecordValue?, forKey: "firstName") 
        record.setObject(self.lastNameField.text! as CKRecordValue?, forKey: "lastName") 



        print("all good") 

        pubDB.save(record, completionHandler: { (record, error) in 

         if error == nil { 

          OperationQueue.main.addOperation { 

           UserDefaults.standard.set(self.emailField.text!, forKey: "Email") 
           email = self.emailField.text! 
           //self.performSegue(withIdentifier: "Games", sender: self) 

          } 

         } else { 

          print(error) 

         } 

        }) 


       } else { 



       } 


      } 



     } else { 

      print(error) 

     } 

    }) 

} 



// MARK: UITextFieldDelegate 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    // Hide the keyboard. 
    textField.resignFirstResponder() 
    return true 
} 

}

Спасибо!

+0

См. мой ответ ниже. Вы также должны знать, как получить «CKAsset» в какой-то момент. Если вы собираетесь хранить актив, вам нужно его также получить. – Pierce

ответ

5

Укажите простой способ сохранить изображение как CKAsset с помощью CloudKit. Обязательно измените имя для своей записи и имя поля для актива при настройке записи.

let documentsDirectoryPath:NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString 
var imageURL: URL! 
let tempImageName = "Image2.jpg" 


func saveImage(_ image: UIImage?) { 

    // Create a CKRecord 
    let newRecord:CKRecord = CKRecord(recordType: "<INSERT_RECORD_NAME") 

    if let image = image { 

     let imageData:Data = UIImageJPEGRepresentation(image, 1.0)! 
     let path:String = self.documentsDirectoryPath.appendingPathComponent(self.tempImageName) 
     try? UIImageJPEGRepresentation(image, 1.0)!.write(to: URL(fileURLWithPath: path), options: [.atomic]) 
     self.imageURL = URL(fileURLWithPath: path) 
     try? imageData.write(to: self.imageURL, options: [.atomic]) 

     let File:CKAsset? = CKAsset(fileURL: URL(fileURLWithPath: path)) 
     newRecord.setObject(File, forKey: "<INSERT_RECORD_ASSET_FIELD_NAME") 
    } 

    if let database = self.publicDatabase { 

     database.save(newRecord, completionHandler: { (record:CKRecord?, error:Error?) in 

      // Check if there was an error 
      if error != nil { 
       NSLog((error?.localizedDescription)!) 
      } 
      else if let record = record { 

       // Do whatever you want with the record, but image record was saved, asset should be saved. 

      } 


     }) 


    } 


} 

Если вы не можете сделать формат JPEG, и нужно сохранить как .png вы можете заменить раздел UIImageJPEGRepresentation с этим:

let imageData:Data = UIImagePNGRepresentation(image)! 
try? UIImagePNGRepresentation(image)!.write(to: URL(fileURLWithPath: path), options: [.atomic]) 

И сделать что-то вроде tempImageNamelet tempImageName = "Image2.png"

Надежда это помогает

+0

Огромное вам спасибо, у меня было два приложения, на которые я не мог этого сделать, и они застряли почти 4 месяца, это первое рабочее решение! – RufusV

+0

@RufusV - Тебе очень рады. Пожалуйста, не стесняйтесь задавать мне больше вопросов, которые могут возникнуть у вас. У меня большой опыт работы с «CloudKit» – Pierce

+0

Привет, Пирс, у меня вопрос для CloudKit, если у вас есть момент. Вот ссылка: http://stackoverflow.com/questions/42370112/fetching-public-record-from-icloud-using-cloudkit Спасибо! :) –