从图像选择器返回后,TextField值重置

时间:2016-08-31 15:53:30

标签: ios swift uiimagepickercontroller

我有一个表格,我在Textfield中显示用户现有数据,并且还有一个个人资料图片上传选项。因此,如果我编辑文本框中的某些字段,然后使用imagePicker上传图像,则数据会重置并显示旧值。我不知道如何解决这个问题

我的代码是: -

class ProfileVC: UIViewController, TopViewDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UITextFieldDelegate {

    @IBOutlet weak var topView: WATopView!
    @IBOutlet weak var firstName: WATextField!
    @IBOutlet weak var lastName: WATextField!
    @IBOutlet weak var email: WATextField!
//    @IBOutlet weak var password: WATextField!
    @IBOutlet weak var university: WATextField!
    @IBOutlet weak var graduationDate: WATextField!
    @IBOutlet weak var major: WATextField!
    @IBOutlet weak var homeTown: WATextField!
    @IBOutlet weak var industry: WATextField!
    @IBOutlet var profileImageView: WAImageView!

    @IBOutlet weak var imagePickerButton:WAButton!

    var pickerView = UIPickerView()
    var uniList = [University]()
    var industryList = [Industry]()
    var selectedIndustry: Industry?
    var selectedUni: University?

    let imagePicker = UIImagePickerController()
    var base64StringOf_my_image = String()
    var prepCompressedImage: UIImage!
    var isDismissing: Bool = false
    let currentUser = User.getCurrentUser()

    var inputViews = UIView()
    let datePickerView = UIDatePicker()

    let profileLoader = ProfileLoader()
    override func viewDidLoad() {
        super.viewDidLoad()
        if fireNotification.pickedImage != nil {
            profileImageView.image = fireNotification.pickedImage!.circle
            self.prepCompressedImage = UIImage.compressImage(fireNotification.pickedImage, compressRatio: 0.9)
            base64StringOf_my_image = appUtility.base64StringOfImage(self.prepCompressedImage)
            fireNotification.pickedImage = nil
        }else {
            profileImageView.sd_setImageWithURL(NSURL(string: currentUser!.userImageURL), placeholderImage: UIImage(named:"no-image"))
            self.prepCompressedImage = UIImage.compressImage(profileImageView.image, compressRatio: 0.9)
            base64StringOf_my_image = appUtility.base64StringOfImage(self.prepCompressedImage)
        }
        pickerView.delegate = self
        pickerView.dataSource = self
        loadIndAndUni()
        topView.delegate = self
        disableEditing(false)
        if !(currentUser?.firstName.isEmpty)! {
            firstName.text = currentUser?.firstName
        }
        if !(currentUser?.lastName.isEmpty)! {
            lastName.text = currentUser?.lastName
        }
        if !(currentUser?.email.isEmpty)! {
            email.text = currentUser?.email
        }
        if !(currentUser?.uni_name.isEmpty)! {
            university.text = currentUser?.uni_name
        }
        if !(currentUser?.startGradDate.isEmpty)! {
            graduationDate.text = currentUser?.startGradDate
        }
        if !(currentUser?.major.isEmpty)! {
            major.text = currentUser?.major
        }
        if !(currentUser?.homeTown.isEmpty)! {
            homeTown.text = currentUser?.homeTown
        }
        if !(currentUser?.ind_name.isEmpty)! {
            industry.text = currentUser?.ind_name
        }
        imagePickerButton.userInteractionEnabled = false

    }

    func loadIndAndUni(){
        if fireNotification.uniList != nil {
            uniList = fireNotification.uniList!
        }else { self.loadUni()}
        if fireNotification.indList != nil {
            industryList = fireNotification.indList!
        }else {self.loadIndustries()}
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func editDoneButtonAction(sender: UIButton) {
        if sender.titleLabel?.text == "Edit" {
            topView.doneText = "Done"
//            PrepUtility.showAlertWithTitle("Edit", error: "You are going to submit data", OKButton: "Edit", VC: self)
            imagePickerButton.userInteractionEnabled = true
            disableEditing(true)
        }
        if sender.titleLabel?.text == "Done" {

//            PrepUtility.showAlertWithTitle("Done", error: "You are going to submit data", OKButton: "Done", VC: self)
            submitRequest()
            topView.doneText = "Edit"
            disableEditing(false)
        }
    }

    func submitRequest(){
        let (isValid , error) = validateFields()
        if !isValid {
            appUtility.showAlert(error!,VC: self)
            return
        }

        if (base64StringOf_my_image.isEmpty) {
            appUtility.showAlert("Please Select Image",VC: self)
            return
        }

        if PrepUtility.connectedToNetwork() {
            appUtility.loadingView(self, isHide: false)
            if selectedUni != nil {
                let indText = industry.text
                var selectedI: Industry?
                for t in industryList {
                    if t.ind_name == indText {
                        selectedI = t
                    }
                }

                let params = ["std_id":currentUser!.std_id,"std_f_name":firstName.text!,"std_l_name":lastName.text!,"std_grad_date":graduationDate.text!,"std_hometown":homeTown.text!,"std_major":major.text!,"uni_id":selectedUni!.uni_id,"std_img":["content_type": "image/png", "filename":"test.png", "file_data": base64StringOf_my_image],"ind_id":selectedI!.ind_id]
                    editProfile(params)
            }else {
                let uniText = university.text
                var selectedU: University?
                for t in uniList {
                    if t.uni_name == uniText {
                        selectedU = t
                    }
                }

                let indText = industry.text
                var selectedI: Industry?
                for t in industryList {
                    if t.ind_name == indText {
                        selectedI = t
                    }
                }

                if selectedU!.uni_id.boolValue {
                    let params = ["std_id":currentUser!.std_id,"std_f_name":firstName.text!,"std_l_name":lastName.text!,"std_grad_date":graduationDate.text!,"std_hometown":homeTown.text!,"std_major":major.text!,"uni_id":selectedU!.uni_id,"std_img":["content_type": "image/png", "filename":"test.png", "file_data": base64StringOf_my_image],"ind_id":selectedI!.ind_id]
                        editProfile(params)
                }
            }
        }else {
            appUtility.loadingView(self, isHide: true)
            appUtility.showNoNetworkAlert()
        }
    }

        func editProfile(params:[String:AnyObject]) {
            profileLoader.tryStudentProfileEdit(params, successBlock: { (user) in
                appUtility.loadingView(self, isHide: true)
                }, failureBlock: { (error) in
                    //                    appUtility.showAlert((error?.userInfo["NSLocalizedDescription"])! as! String, VC: self)
                    if let err = error?.userInfo["NSLocalizedDescription"] {
                        appUtility.showAlert(err as! String, VC: self)
                        appUtility.loadingView(self, isHide: true)
                    }else {
                        appUtility.loadingView(self, isHide: true)
                        appUtility.showAlert("Something went wrong", VC: self)
                    }
            })
        }

    func openMenu() {
        firstName.resignFirstResponder()
        lastName.resignFirstResponder()
//        email.resignFirstResponder()
//        password.resignFirstResponder()
        university.resignFirstResponder()
        graduationDate.resignFirstResponder()
        major.resignFirstResponder()
        homeTown.resignFirstResponder()
        industry.resignFirstResponder()

        self.mainSlideMenu().openLeftMenu()
    }

    //MARK:- Private Methods

    private func validateFields() -> (Bool , String?) {

        if !firstName.isValid() {
            hideView()
            return (false , "Please enter your First Name")
        }

        if !lastName.isValid() {
            hideView()
            return (false , "Please enter your Last Name")
        }

//        if !email.isValid() {
//            hideView()
//            return (false , "Please enter email")
//        }
//        
//        if email.isValid() {
//            hideView()
//            let text = email.text
//            if !(text!.hasSuffix(".edu")) {
//                return (false , "Please enter email that having .edu")
//            }
//            if !email.text!.isValidEmail() {
//                return (false , "Please Enter a valid email...")
//            }
//        }

        if !university.isValid() {
            hideView()
//            return (false , "Please select University")
        }

        if !homeTown.isValid() {
            hideView()
//            return (false , "Please enter address")
        }
//        if !password.isValid() {
//            return (false , "Please enter password")
//        }
//        
        return (true , nil)
    }

    private func showGradDatePicker() {
        //Create the view
        graduationDate.inputView = inputViews
        inputViews = UIView(frame: CGRectMake(0, self.view.frame.height, self.view.frame.width, 240))
        inputViews.backgroundColor = UIColor.whiteColor()
        let datePickerView  : UIDatePicker = UIDatePicker(frame: CGRectMake(0, 40, 0, 0))
        datePickerView.datePickerMode = UIDatePickerMode.Date
        inputViews.addSubview(datePickerView) // add date picker to UIView

        let doneButton = UIButton(frame: CGRectMake((self.view.frame.size.width/2) - (100/2), 0, 100, 50))
        doneButton.setTitle("Done", forState: UIControlState.Normal)
        doneButton.setTitle("Done", forState: UIControlState.Highlighted)
        doneButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
        doneButton.setTitleColor(UIColor.grayColor(), forState: UIControlState.Highlighted)

        inputViews.addSubview(doneButton) // add Button to UIView

        doneButton.addTarget(self, action: #selector(ScheduleVC.doneButton(_:)), forControlEvents: UIControlEvents.TouchUpInside) // set button click event
//        sender.inputView = inputView
        datePickerView.addTarget(self, action: #selector(ScheduleVC.datePickerValueChanged(_:)), forControlEvents: UIControlEvents.ValueChanged)
        self.view.addSubview(inputViews)
        datePickerValueChanged(datePickerView) // Set the date on start.
        UIView.animateWithDuration(0.5) {
            self.inputViews.frame = CGRect(x: 0, y: self.view.frame.height - 270, width: self.view.frame.width, height: 240)
        }
    }

    func doneButton(sender:UIButton) {
        hideView()
    }

    func hideView() {
        UIView.animateWithDuration(0.9) {
            self.inputViews.frame = CGRect(x: 0, y:0, width: self.view.frame.width, height: 240)
            self.inputViews.removeFromSuperview()
        }
    }

    func datePickerValueChanged(sender:UIDatePicker) {
//        isDateSet = true
        let dateFormatter = NSDateFormatter()
//        dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
        dateFormatter.dateFormat = "yyyy-MM-dd"
//        dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
        graduationDate.text = dateFormatter.stringFromDate(sender.date)
    }

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        if textField == university {
            self.resignFirstResponder(university)
            industry.tag = 1
            university.tag = 0
            graduationDate.tag = 1
            pickerViewToolBar(textField)
        }

        if textField == industry {

            self.resignFirstResponder(industry)
            industry.tag = 0
            university.tag = 1
            graduationDate.tag = 1
            pickerViewToolBar(textField)
        }

        if textField == graduationDate{

            industry.tag = 1
            university.tag = 1
            graduationDate.tag = 0

            self.resignFirstResponder(graduationDate)
            showGradDatePicker()
        }

        return true
    }

    private func disableEditing(boo: Bool) {
        firstName.enabled = boo
        lastName.enabled = boo
//        email.enabled = boo
//        password.enabled = boo
        university.enabled = boo
        graduationDate.enabled = boo
        major.enabled = boo
        homeTown.enabled = boo
        industry.enabled = boo
    }

    private func resignFirstResponder(textField:UITextField) {
        if textField != firstName {
//            hideView()
            textField.resignFirstResponder()
        }
        if textField != lastName {
//            hideView()
            textField.resignFirstResponder()
        }
//        if textField != email{
////            hideView()
//            textField.resignFirstResponder()
//        }
//        if textField != password {
////            hideView()
//            textField.resignFirstResponder()
//        }
        if textField != university {
//            hideView()
            textField.resignFirstResponder()
        }
        if textField != graduationDate {
            textField.resignFirstResponder()
        }
        if textField != major {
//            hideView()
            textField.resignFirstResponder()
        }
        if textField != homeTown {
//            hideView()
            textField.resignFirstResponder()
        }
        if textField != industry {
//            hideView()
            textField.resignFirstResponder()
        }
    }

    private func resignAllTextFields() {
        firstName.resignFirstResponder()
    }

    //MARK:- Public Methods
    func pickerViewToolBar(sender: UITextField) {
        var doneButton:UIBarButtonItem?
        if university.tag == 0 {
            university.inputView = pickerView
        }
        if industry.tag == 0 {
            industry.inputView = pickerView
        }
        if graduationDate.tag == 0 {
            graduationDate.inputView = pickerView
        }
//        departureDatePickerView.datePickerMode = UIDatePickerMode.Date

        // Sets up the "button"

        // Creates the toolbar
        let toolBar = UIToolbar()
        toolBar.barStyle = .Default
        toolBar.translucent = true
        toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
        toolBar.sizeToFit()

        // Adds the buttons
        if(sender.tag == 0){
            //            self.nextButton?.hidden = true
            doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(PrepInfoVC.doneClick(_:)))
            doneButton!.tag = 0
        }
        //        else if(sender.tag == 2){
        ////            self.nextButton?.hidden = true
        //            doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(PrepInfoVC.doneClick(_:)))
        //            doneButton!.tag = 2
        //        }
        let spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: #selector(PrepInfoVC.cancelClick))
        toolBar.setItems([cancelButton, spaceButton, doneButton!], animated: false)
        toolBar.userInteractionEnabled = true

        // Adds the toolbar to the view
        if university.tag == 0 {
            university.inputAccessoryView = toolBar
        }
        if industry.tag == 0 {
            industry.inputAccessoryView = toolBar
        }
        if graduationDate.tag == 0 {
            graduationDate.inputAccessoryView = toolBar
        }
    }

    func doneClick(sender:UIBarButtonItem) {
        if industry.tag == 0 {
            selectedIndustry = industryList[pickerView.selectedRowInComponent(0)]
            industry.text = selectedIndustry!.ind_name
            industry.tag = 1
            industry.resignFirstResponder()
        }else{
            selectedUni = uniList[pickerView.selectedRowInComponent(0)]
            university.text = selectedUni!.uni_name
            university.tag = 1
            university.resignFirstResponder()
        }
    }
    func cancelClick() {
        if industry.tag == 0 {
            industry.tag = 1
            industry.resignFirstResponder()
        }else {
            university.tag = 1
            university.resignFirstResponder()
        }
    }

    //MARK:- ImagePicker
    @IBAction func loadImageButtonTapped(sender: UIButton) {
        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        imagePicker.allowsEditing = true
        imagePicker.delegate = self
        self.hidesBottomBarWhenPushed = true
        self.navigationController?.presentViewController(imagePicker, animated: true, completion: nil)
        self.hidesBottomBarWhenPushed = false
    }

    // MARK: - UIImagePickerControllerDelegate Methods
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        print(info)
        if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
            profileImageView.image = pickedImage.circle
            self.prepCompressedImage = UIImage.compressImage(pickedImage, compressRatio: 0.9)
            base64StringOf_my_image = appUtility.base64StringOfImage(self.prepCompressedImage)
//            self.viewWillAppear(false)
            fireNotification.pickedImage = pickedImage
            isDismissing = true
        }else{}
        imagePicker.delegate = nil
        self.dismissViewControllerAnimated(true,completion: nil)
        isDismissing = true
    }
}

extension ProfileVC: UIPickerViewDelegate,UIPickerViewDataSource {

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        if university.tag == 0 {
            return 1
        }else {
            return 1
        }
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        if university.tag == 0 {
            return uniList.count
        }
        else {
            return industryList.count
        }
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if university.tag == 0 {
            let uni = uniList[row]
            return String(uni.uni_name)
        }else {
            let ind = industryList[row]
            return String(ind.ind_name)
        }
    }
}

//MARK:- SearchVC
extension ProfileVC {
    func loadUni() {
      let userLoader = UserLoader()
        let params = ["":""]
        if PrepUtility.connectedToNetwork() {
            userLoader.tryUniversity(params, successBlock: { (university) in
                self.uniList = university!
            }) { (error) in
                if let err = error?.userInfo["NSLocalizedDescription"] {
                    appUtility.showAlert(err as! String, VC: self)
                }else {
                    appUtility.showAlert("Something went wrong", VC: self)
                }
            }
        }else {
            appUtility.showNoNetworkAlert()
        }
    }

    func loadIndustries() {
      let userLoader = UserLoader()
        if PrepUtility.connectedToNetwork() {
            userLoader.tryIndustry(["":""], successBlock: { (industry) in
                self.industryList = industry!
            }) { (error) in
                if let err = error?.userInfo["NSLocalizedDescription"] {
                    appUtility.showAlert(err as! String, VC: self)
                }else {
                    appUtility.showAlert("Something went wrong", VC: self)
                }
            }
        }else {
            appUtility.showNoNetworkAlert()
        }
    }
}

2 个答案:

答案 0 :(得分:0)

由于您未在viewWillLoad或类似方法中初始化您的用户界面,我会说您的问题来自您的设备,试图获得更多空间。

你可能已经没有内存了,而系统会杀死它(在你的情况下是你以前的控制器)。

当您关闭图像选择器时,您的控制器正在重新加载其视图(使用您的初始值)

答案 1 :(得分:0)

我个人会将标签的.text保存到先前声明的变量中(无论如何都需要它们),并且在viewDidAppear方法中将变量值分配给textField.Text,当视图第一次出现时显示为空,当您调用图像选择器时保存新值,然后当原始视图再次出现时,它将分配您之前保存的值。