简体   繁体   中英

Swift UILabel Programmatically Updates after UIButton Pressed

I am looking to program a UILabel to give confirmation if signup was successful or unsuccessful. I am lost on how to go about creating it. I have a label placed in the SignUpViewController. I am lost on where to go about setting up the code to give the feedback though. Please let me know how to go about doing this. Thank You in advanced.

import UIKit

class signUpViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {

    @IBOutlet var usernameTextfield: UITextField!

    @IBOutlet var emailTextfield: UITextField!

    @IBOutlet var passwordTextfield: UITextField!

    @IBOutlet var compasswordTextfield: UITextField!

    @IBOutlet var birthdateTextfield: UITextField!

    @IBOutlet var combirthdateTextfield: UITextField!

    @IBOutlet var confirmationLable: UILabel!

    @IBAction func signupButton(sender: AnyObject) {

        var pahser:PFUser = PFUser()
        pahser.username = usernameTextfield.text
        pahser.email = emailTextfield.text
        pahser.password = passwordTextfield.text

        pahser.signUpInBackgroundWithBlock{
            (success:Bool!, error:NSError!)->Void in
            if error == nil {
                println("Signup Successfull")

                var imagePicker:UIImagePickerController = UIImagePickerController()
                imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary

                imagePicker.delegate = self

                self.presentViewController(imagePicker, animated: true, completion: nil)

            }else{

                let errorString = error.localizedDescription
                println(errorString)

            }
        }
    }


    func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info: NSDictionary!) {
        let pickedImage:UIImage = info.objectForKey(UIImagePickerControllerOriginalImage) as UIImage
        let scaledImage = self.scaleImageWith(pickedImage, and: CGSizeMake(100, 100))
        let imageData = UIImagePNGRepresentation(scaledImage)
        let imageFile:PFFile = PFFile(data: imageData)
        PFUser.currentUser().setObject(imageFile, forKey: "profileImage")
        PFUser.currentUser().saveInBackground()

        picker.dismissViewControllerAnimated(true, completion: nil)

    }

    func scaleImageWith(newImage:UIImage, and newSize:CGSize)->UIImage{
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        newImage.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
        UIGraphicsEndImageContext()

        return newImage
    }



    override func viewDidLoad() {
        super.viewDidLoad()
        self.passwordTextfield.delegate = self;
        self.usernameTextfield.delegate = self;
        self.emailTextfield.delegate = self;
        self.compasswordTextfield.delegate = self;
        self.birthdateTextfield.delegate = self;
        self.combirthdateTextfield.delegate = self

    }
        // Do any additional setup after loading the view.


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

    func textFieldShouldReturn(textField: UITextField!) -> Bool {
        self.view.endEditing(true);
        return false;
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}
pahser.signUpInBackgroundWithBlock{
    (success:Bool!, error:NSError!)->Void in
        if error == nil {
            println("Signup Successfull")
            confirmationLable.text = "Signup Successfull"
            var imagePicker:UIImagePickerController = UIImagePickerController()
            imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary

            imagePicker.delegate = self
            dispatch_async(dispatch_get_main_queue()) {
                self.presentViewController(imagePicker, animated: true, completion: nil)
            }


        }else{

            let errorString = error.localizedDescription
            confirmationLable.text = error.localizedDescription
            println(errorString)

        }
    }

Hope this helps.. :)

pahser.signUpInBackgroundWithBlock{ calls the completion block when the signup api call returns whether its failure or success. You can set your label value inside that block.
Also the UI updates need to be done in the main queue.
You can check out arthankamal's answer if you want to delay the presentViewController function call.
But normally it's better to indicate the user only if there is a failure.

pahser.signUpInBackgroundWithBlock{
    (success:Bool!, error:NSError!)->Void in
     if (error == nil)
     {
         dispatch_async(dispatch_get_main_queue(),  {
           confirmationLable.text = "Success"
        });

     }
     else 
     {
        dispatch_async(dispatch_get_main_queue(),  {
           confirmationLable.text = "Failure"
        });
     }
}

Solution 1: Delay your presentViewController function within the block, check this link for how to delay, dispatch_after - GCD in swift?

pahser.signUpInBackgroundWithBlock{
        (success:Bool!, error:NSError!)->Void in
        if error == nil {

            confirmationLable.text = "Sign Up Success";

            // Delay the Presenting View Controller, 
            // so that you can see that your sign up label success message
            delay(0.4) {
                self.presentViewController(imagePicker, animated: true, completion: nil)
            }
        }else{
            let errorString = error.localizedDescription
            println(errorString)
        }
    }

// Function To delay your present view controller, from Stackoverflow answer
func delay(delay:Double, closure:()->()) {
dispatch_after(
    dispatch_time(
        DISPATCH_TIME_NOW,
        Int64(delay * Double(NSEC_PER_SEC))
    ),
    dispatch_get_main_queue(), closure)
}

Solution 2: Use Toast View, check this github project https://github.com/Rannie/Toast-Swift

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM