2017-09-18 2 views
0

Ich habe zwei Viewcontrollers: der erste ist ViewProfile und der zweite ist EditProfile.Wie speichert man Daten wie ein Profil?

In der ersten Ansicht gibt es eine Schaltfläche mit dem Namen "Profil bearbeiten", die an EditProfile gesendet wird.

In diesem VC gibt es textfields, ImageView, date picker und ein segment control.

Jetzt muss ich den Algorithmus finden, um alle Parameter zu speichern und zurück zu ViewProfile kommen.

Ich kann dismiss() nicht verwenden, weil ich eine Ablehnungskontrolle auf Bar-Registerkarte (für Änderungen abbrechen) festgelegt habe. Ich habe versucht, durch durch Verwendung von globalen Variablen aus ViewProfile aufrufen, aber nicht funktioniert:

Hier ist der ViewProfile Code:

@IBAction func saveButton(_ sender: Any) { 

    func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let vc = segue.destination as! Profilo 
     vc.name = Name 
     vc.surname = Surname 
     vc.cell = Cell 
     vc.email = Email 
     vc.birthdate = Birthdate 
     vc.avatar = Avatar 
     vc.gender = Gender 
     } 
    perform(#selector(getter: back)) //this is the selector of dismiss func but still no performing 
} 

Ps: Ich habe noch nicht verlinkt sind Etiketten von ViewProfile Ursache würde ich testen, ob Bild zuerst genannt wurde .


bearbeiten

machte ich eine intelligente denken ... Ich entschied navigationController?.popViewController zu verwenden und es hat funktioniert, aber es ist immer noch ein Problem. Ich kann Avatar und Date nicht retrive, warum?

Dies ist ViewProfile

import UIKit 

class Profilo: UIViewController { 


    func loadData(){ 
     //load avatar 
     let avatardefaults = UserDefaults.standard 
     if let avatarDefaults = avatardefaults.object(forKey: "profile_avatar") as? UIImage { 
      photo.image = avatarDefaults 
     } 
     //load name 
     let namedefaults = UserDefaults.standard 
     if let nameDefaults = namedefaults.object(forKey: "profile_name") as? String { 
      labelName.text = nameDefaults 
     //load surname 
     let surnamedefaults = UserDefaults.standard 
     if let surnameDefaults = surnamedefaults.object(forKey: "profile_surname") as? String { 
      labelSurname.text = surnameDefaults 
     } 
     //load surname 
     let celldefaults = UserDefaults.standard 
     if let cellDefaults = celldefaults.object(forKey: "profilo_cell") as? String { 
      labelCell.text = cellDefaults 
     } 
     //load email 
     let emaildefaults = UserDefaults.standard 
     if let emailDefaults = emaildefaults.object(forKey: "profile_email") as? String { 
      labelEmail.text = emailDefaults 
     } 
     //load birth 
     let birthdefaults = UserDefaults.standard 
     if let birthDefaults = birthdefaults.object(forKey: "profile_birth") as? String { 
      labelBirth.text = birthDefaults 
     } 
     //load sex 
     let sexdefaults = UserDefaults.standard 
     if let sexDefaults = sexdefaults.object(forKey: "profile_sex") as? String { 
      labelSex.text = sexDefaults 
      } 
     } 
    } 
} 

Dies ist EditProfile

@IBAction func EditPhoto(_ sender: AnyObject) { 

     let image = UIImagePickerController() 
     image.delegate = self 

     image.sourceType = UIImagePickerControllerSourceType.photoLibrary 

     image.allowsEditing = false 

     self.present(image, animated: true) 
     { 
      //After it's complete 
     } 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let image = info[UIImagePickerControllerOriginalImage] 
as? UIImage 
     { 
      Avatar.image = image 
     } 
     else { 
      //Error message 
     } 
     self.dismiss(animated: true, completion: nil) 
    } 


    @IBOutlet weak var datePickerTxt: UITextField! 

    let datePicker = UIDatePicker() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     createDatePicker() 
    } 

    func createDatePicker(){ 
     //format for picker 
     datePicker.datePickerMode = .date 

     // toolbar 
     let toolbar = UIToolbar() 
     toolbar.sizeToFit() 

     // bar button item 
     let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed)) 
     toolbar.setItems([doneButton], animated: false) 

     //set bar button item in date menu 
     datePickerTxt.inputAccessoryView = toolbar 

     // give date at text field 
     datePickerTxt.inputView = datePicker 


    } 
    func donePressed() { 

     // format date 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = .short 
     dateFormatter.timeStyle = .none 
     datePickerTxt.text = dateFormatter.string(from: datePicker.date) 
     self.view.endEditing(true) 
    } 

    @IBOutlet weak var back: UIBarButtonItem! 



    @IBAction func saveButton(_ sender: Any) { 

     //save avatar 
     let Avatar = self.Avatar.image 
     let avatardefaults = UserDefaults.standard 
     avatardefaults.set(Avatar, forKey: "profile_avatar") 
     avatardefaults.synchronize() 
     //save name 
     let Name = self.Name.text 
     let namedefaults = UserDefaults.standard 
     namedefaults.set(Name, forKey: "profile_name") 
     namedefaults.synchronize() 
     //save surname 
     let surname = Surname.text 
     let surnamedefaults = UserDefaults.standard 
     surnamedefaults.set(surname, forKey: "profile_surname") 
     surnamedefaults.synchronize() 
     //save cell 
     let cell = Cell.text 
     let celldefaults = UserDefaults.standard 
     celldefaults.set(cell, forKey: "profile_cell") 
     celldefaults.synchronize() 
     //save email 
     let email = Email.text 
     let emaildefaults = UserDefaults.standard 
     emaildefaults.set(email, forKey: "profile_email") 
     emaildefaults.synchronize() 
     //save date 
     let date = datePickerTxt.text 
     let datadefaults = UserDefaults.standard 
     datedefaults.set(date, forKey: "profile_date") 
     datedefaults.synchronize() 
     //save sex 
     let sex = Sex.titleForSegment(at: Sex.selectedSegmentIndex) 
     let sexdefaults = UserDefaults.standard 
     sexdefaults.set(sex, forKey: "profile_sex") 
     sexdefaults.synchronize() 
     navigationController?.popViewController(animated: true) 
    } 
} 
+0

Zu allererst appens sollten Sie keine Variablen, die mit einem Großbuchstaben „E-Mail“ Zweite Sie beginnen kann einen Navigationscontroller verwenden, so dass Sie problemlos zu der VC zurückkehren können, von der Sie gekommen sind. – Siyavash

+1

Verwenden Sie eine Klasse (Referenztyp) als Modell, übergeben Sie eine Instanz an den Edit-Controller und behalten Sie die Referenz. Ändern Sie die Eigenschaften. Aufgrund der Referenzsemantik bleiben die Daten nach der Rückkehr zum ersten Controller bestehen. Alternativ übergeben Sie einen Callback-Abschluss an den Edit-Controller, der aufgerufen wird, bevor der Controller beendet wird. – vadian

+0

ich kann den Navigationscontroller nicht verwenden, weil der Hauptcontroller der App –

Antwort

0

ich es endlich geschafft. Ich muss nur Aussagen Bedingungen für die Vermeidung von Null setzen und NSKeyedArchiver verwenden. Bei der Ausgabe von nil date war es nur eine fehlende Einschränkung ... ich habe nur alle Einschränkungen gelöscht und sie besser gemacht.

Dies ist, was bei ViewProfile

func loadData(){ 
     //load avatar 
     if UserDefaults.standard.object(forKey: "profile_avatar") != nil{ 
     let decoded = UserDefaults.standard.object(forKey: "profile_avatar") as! Data 
     let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) 
     self.photo.image = decodedTeams as? UIImage 
     } else 
     { 
      self.photo.image = #imageLiteral(resourceName: "frame.png") 
     } 
     //load name 
     let namedefaults = UserDefaults.standard 
     if namedefaults.object(forKey: "profile_name") != nil { 
     if let nameDefaults = namedefaults.object(forKey: "profile_name") as? String { 
      labelName.text = nameDefaults 
      } 
     } 
     else { 
      labelName.text = "" 
     } 
     //load surname 
     let surnamedefaults = UserDefaults.standard 
     if surnamedefaults.object(forKey: "profile_surname") != nil { 
     if let surnameDefaults = surnamedefaults.object(forKey: "profile_surname") as? String { 
      labelSurname.text = surnameDefaults 
     } 
     }else { 
      labelSurname.text = "" 
     } 
     //load cell 
     let celldefaults = UserDefaults.standard 
     if celldefaults.object(forKey: "profile_cell") != nil { 
     if let cellDefaults = celldefaults.object(forKey: "profile_cell") as? String { 
      labelCell.text = cellDefaults 
     } 
     } else { 
      labelCell.text = "" 
     } 
     //load email 
     let emaildefaults = UserDefaults.standard 
     if emaildefaults.object(forKey: "profile_email") != nil { 
     if let emailDefaults = emaildefaults.object(forKey: "profile_email") as? String { 
      labelEmail.text = emailDefaults 
      }} 
     else { 
      labelEmail.text = "" 
     } 
     //load birth 
     let birthdefaults = UserDefaults.standard 
     if birthdefaults.object(forKey: "profile_birth") != nil { 
     if let birthDefaults = datadefaults.object(forKey: "profile_birth") as? String { 
      labelBirth.text = birthDefaults 
      }} 
     else { 
      labelBirth.text = "" 
     } 
     //load sex 
     let sexdefaults = UserDefaults.standard 
     if (sexdefaults.object(forKey: "profile_sex") != nil) { 
     if let sexDefaults = sexdefaults.object(forKey: "profile_sex") as? String { 
      labelSex.text = sexDefaults 
      }} 
     else { 
      labelSex.text = "" 
     } 
     } 

appens Und das ist, was bei EditProfile

@IBAction func saveButton(_ sender: Any) { 
     //save avatar 
     if self.image != nil { 
      let imageData = self.image 
      let encodedData = NSKeyedArchiver.archivedData(withRootObject: imageData!) 
      let userDefaults = UserDefaults.standard 
      userDefaults.set(encodedData, forKey: "profile_avatar") 
      userDefaults.synchronize() 
     } else 
     { 
      //Errore 
     } 

     //save name 
     let Name = self.Name.text 
     let namedefaults = UserDefaults.standard 
     namedefaults.set(Name, forKey: "profile_name") 
     namedefaults.synchronize() 
     //save surname 
     let surname = Surname.text 
     let surnamedefaults = UserDefaults.standard 
     surnamedefaults.set(surname, forKey: "profile_surname") 
     surnamedefaults.synchronize() 
     //save cell 
     let cell = Cell.text 
     let celldefaults = UserDefaults.standard 
     celldefaults.set(cell, forKey: "profile_cell") 
     celldefaults.synchronize() 
     //save email 
     let email = Email.text 
     let emaildefaults = UserDefaults.standard 
     emaildefaults.set(email, forKey: "profile_email") 
     emaildefaults.synchronize() 
     //save birth 
     let birth = datePickerTxt.text 
     let birthdefaults = UserDefaults.standard 
     birthdefaults.set(date, forKey: "profile_birth") 
     birthdefaults.synchronize() 
     //save sex 
     let sex = Sex.titleForSegment(at: Sex.selectedSegmentIndex) 
     let sexdefaults = UserDefaults.standard 
     sexdefaults.set(sex, forKey: "profile_sex") 
     sexdefaults.synchronize() 
     navigationController?.popViewController(animated: true) 
    }