Creating Image Preview using Swift and Parse

2019-09-06 15:32发布

问题:

I'm currently writing a social networking application in Swift. Inside my app I have feature that a user can send a message to the timeline with a image attached. I want to be able to retrieve the image and preview it using a UIImageView inside my timeline. However I want the image to display next to the user that sent the image and if a user did not post a image the image preview does not appear along with the message. A good example of the functionally I want to have is the way Facebook and Twitter display images in their respective iOS apps. in the meantime I have written the following function to retrieve the images, but i'm having trouble matching them up to the proper user. I will have my function posted below as well as link to download the source code to my timeline. Thanks in advance

func loadImages()

    {
        var query = PFQuery(className: "imagesUploaded")
        query.orderByDescending("objectId")
        query.whereKey("user", equalTo:PFUser.currentUser())


        query.findObjectsInBackgroundWithBlock {
            (objects:[AnyObject]!,error:NSError!) -> Void in
            if error == nil {
                let imagesobjects = objects as [PFObject]

                for object : PFObject in objects as [PFObject] {
                    let image = object["filename"] as PFFile

                    image.getDataInBackgroundWithBlock {
                        (imageData:NSData!, error:NSError!) -> Void in
                        if error == nil {
                            if let finalimage = UIImage(data: imageData)
                            {
                                let url = image.url
                                println(url)
                                cell.imagedisplay.image = finalimage



                            }
                        }

                    }
                }
            }
        }
        }

TimeLine Source Code

回答1:

I did this with this class :

import UIKit
import Parse

class postViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    var photoSelected:Bool = false
    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    @IBOutlet weak var imageToPost: UIImageView!
    @IBOutlet weak var shareText: UITextField!

    @IBAction func logout(sender: AnyObject) {
        PFUser.logOut()
        self.performSegueWithIdentifier("logout", sender: "self")
    }   

    @IBAction func chooseImage(sender: AnyObject) {
        // Creation d'une variable image controlleur
        var image = UIImagePickerController()
        dispatch_async(dispatch_get_main_queue()){
        image.delegate = self
        image.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        image.allowsEditing = false

            self.presentViewController(image, animated: true, completion: nil)}
    }

    @IBAction func postImage(sender: AnyObject) {
        var error = ""
        if (photoSelected == false){
            error = "Please Select an Image to post"
        } else if (shareText.text == "") {
            error = "Please enter a message"
        }
        if (error != ""){
            displayAlert("Cannot post Image", error: error)
        } else {

            activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50))
            // On positione l'indicateur au centre de l'ecran
            activityIndicator.center = self.view.center
            activityIndicator.hidesWhenStopped = true
            activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
            view.addSubview(activityIndicator)
            activityIndicator.startAnimating()
            UIApplication.sharedApplication().beginIgnoringInteractionEvents()

            var post = PFObject(className: "post")
            post["Title"] = shareText.text
            post["username"] = PFUser.currentUser().username

            post.saveInBackgroundWithBlock{(success: Bool, error: NSError!) -> Void in

                if success == false {
                    self.activityIndicator.stopAnimating()
                    UIApplication.sharedApplication().endIgnoringInteractionEvents()

                    self.displayAlert("Could not post Image", error: "Please try again later")

                } else {

                    let imageData = UIImagePNGRepresentation(self.imageToPost.image)
                    let imageFile = PFFile(name: "image.png", data: imageData)

                    post["imageFile"] = imageFile
                    post.saveInBackgroundWithBlock{(success: Bool, error: NSError!) -> Void in

                        self.activityIndicator.stopAnimating()
                        UIApplication.sharedApplication().endIgnoringInteractionEvents()

                        if success == false {

                            self.displayAlert("Could not post Image", error: "Please try again later")
                        } else {
                            self.displayAlert(" Image Posted !", error: "Your image has been posted successfully")
                            self.photoSelected = false
                            self.imageToPost.image = UIImage(named: "default-placeholder")
                            self.shareText.text = ""
                            println("Posted succesfully")
                        }
                    }
                }
            }
        }
    }

    func displayAlert(title: String, error: String){
        var alert = UIAlertController(title: title, message: error, preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: {action in
            }))
            self.presentViewController(alert, animated: true, completion: nil)
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
        println("Image is selected!")
        self.dismissViewControllerAnimated(true, completion: nil)

        imageToPost.image = image

        photoSelected = true
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        photoSelected = false

        imageToPost.image = UIImage(named: "default-placeholder")

        self.shareText.text = ""
    }

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

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true)
    }


    func textFiledShouldReturn(textField: UITextField!) -> Bool{
        shareText.resignFirstResponder()
        return true
    }
}

Edit :

You can add a test like this :

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

        self.dismissViewControllerAnimated(true, completion: nil)
        initialisationPhoto()

        photoUtilisateur.image = image

        if (photoUtilisateur.image != nil){
            println("Image is selected!")
            photoSelected = true
        }
    }

func initialisationPhoto(){
    //Initialisation de la photo utilisateur
    photoSelected = false
    photoUtilisateur.image = UIImage(named: "placeholder")
}