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)
}
}
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
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
ich kann den Navigationscontroller nicht verwenden, weil der Hauptcontroller der App –