1
votes

Délégué personnalisé nul et ne pas enregistrer les paramètres par défaut de l'utilisateur

Je crée un délégué dans UIView pour transmettre les données à mon contrôleur et je les enregistre dans userdefaults. mais quand j'essaye de le sauver, il retourne nul. Comment puis-je l'enregistrer et ne pas renvoyer nil.

ceci est mon code dans UIView et mon protocole

class ProfileController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, SaveUpdateInputDelegate {

// I need to initialized this to create autolayout
let formView: FormUIView = FormUIView()

let saveButton: UIButton = {
    let btn = UIButton(type: .system)
    btn.setTitle("Save", for: .normal)
    btn.setTitleColor(.white, for: .normal)
    btn.backgroundColor = #colorLiteral(red: 0.1254901961, green: 0.7411764706, blue: 1, alpha: 1)
    btn.layer.cornerRadius = 18
    btn.addTarget(self, action: #selector(handleSave), for: .touchUpInside)
    return btn
}()

override func viewDidLoad() {
    super.viewDidLoad()
    formView.delegate = self
    handleSave()
}

@objc func handleSave() {
    print("saved...")
    guard let data = UserDefaults.standard.object(forKey: "profileImageEditedKey") as? Data else { return }
    let image = UIImage.init(data: data)
    DispatchQueue.main.async {
        self.profileImageView.image = image?.withRenderingMode(.alwaysOriginal)
    }

    saveInputText()
    fetchInputText()
}

func saveInputText() {
    UserDefaults.standard.set(formView.nameTextField.text!, forKey: "nameTextFieldKey")
    UserDefaults.standard.set(formView.emailTextField.text!, forKey: "emailTextFieldKey")
    UserDefaults.standard.set(formView.titleTextField.text!, forKey: "titleTextFieldKey")
    UserDefaults.standard.set(formView.locationTextField.text!, forKey: "locationTextFieldKey")
    UserDefaults.standard.synchronize()
}

func fetchInputText() {
    let name = UserDefaults.standard.value(forKey: "nameTextFieldKey") as? String ?? ""
    let email = UserDefaults.standard.value(forKey: "emailTextFieldKey") as? String ?? ""
    let title = UserDefaults.standard.value(forKey: "titleTextFieldKey") as? String ?? ""
    let location = UserDefaults.standard.value(forKey: "locationTextFieldKey") as? String ?? ""

    formView.nameTextField.text = name
    formView.emailTextField.text = email
    formView.titleTextField.text = title
    formView.locationTextField.text = location
}

c'est mon code de contrôleur qui a un bouton pour enregistrer l'entrée texte et enregistrez-le dans userdefaults

protocol SaveUpdateInputDelegate {
   func saveInputText()
   func fetchInputText()
}

class FormUIView: UIView {

var delegate: SaveUpdateInputDelegate?

let nameLabel = ProfileCustomLabel(textName: "Name")
let nameTextField = CustomTextField(placeholderName: "Name")

let emailLabel = ProfileCustomLabel(textName: "Email")
let emailTextField = CustomTextField(placeholderName: "Email")

let titleLabel = ProfileCustomLabel(textName: "Title")
let titleTextField = CustomTextField(placeholderName: "Title")

let locationLabel = ProfileCustomLabel(textName: "Location")
let locationTextField = CustomTextField(placeholderName: "Location")


5 commentaires

pouvez-vous mettre le code de l'appel de la fonction "saveInputText"?


Je l'ai mis en vueDidLoad @JatinKathrotiya


Si vous appelez save Input Text () dans viewDidLoad (), les champs de texte sont sûrement vides et aucun ne sera enregistré dans UserDefaults


Pouvez-vous mettre plus de code lié à la façon dont vous avez appelé saveInputText et fetchInputText ?


@Kamran je mets à jour ma question vérifie-la


3 Réponses :


1
votes

Je ne comprends pas pourquoi vous utilisez Delegate pour transmettre des données qui ne sont pas nécessaires ou vous faites quelque chose de mal.

Comme tous sont le champ de texte, vous pouvez donc définir directement textField Delegate sur ViewController strong > Il n'est donc pas nécessaire de passer de la valeur et ce n'est pas une utilisation appropriée du délégué ici

Supposons que vous ne puissiez pas faire cela, alors vous devez appeler le délégué à chaque fois que textFieldShouldChangeCharacter ou textFieldDidEndEditing Appelé mais comme je l'ai dit, ce n'est pas la bonne manière

Étape 1: Vérifiez que toutes les informations correctes sont enregistrées à l'intérieur

Étape 2: UserDefault a déjà une méthode pour récupérer la chaîne

Remplacer ceci

 let name = UserDefaults.standard.string(forKey: "nameTextFieldKey") ?? ""

avec

let name = UserDefaults.standard.value(forKey: "nameTextFieldKey") as? String ?? ""

et d'autres aussi.


8 commentaires

où l'utilisateur a appelé la fonction formView.saveInputText () dans la classe


@ Anbu.Karthik C'est l'exigence de l'utilisateur. Sans voir tous les scénarios, il est difficile de le dire. Cependant, il n'en a pas besoin. Comme tous sont des champs de texte, il peut directement définir le délégué du champ de texte sur viewcontroller


@ Anbu.Karthik a modifié ma réponse


donc je ne l'enregistre dans userdefaults qu'une seule fois dans 'textFieldShouldChangeCharacter'? et récupérez-le dans cela aussi @PrashantTukadiya


@ferryawijayanto Pourriez-vous s'il vous plaît me faire savoir Quelle est la raison derrière cette structure désordonnée? Donc, je peux vous fournir une meilleure solution si je le peux. Qu'en est-il du délégué dans ViewController?


@PrashantTukadiya Je veux créer une vue avec un champ de texte, une étiquette et un bouton. donc je veux nettoyer mon code pour séparer ce qui est à l'intérieur de la vue et ce qui est à l'intérieur du contrôleur. comme mon champ de texte dans mon UIView, je dois lui transmettre les informations dans mon contrôleur, je ne sais pas si c'est la bonne méthode. donc c'est la raison pour laquelle j'ai créé cette structure


@ferryawijayanto Votre intension a sans aucun doute raison. mais la méthode que vous choisissez semble poser problème au cas où votre application se développerait à l'avenir. Ce que je vous suggère, c'est qu'il est bien de conserver votre étiquette et votre champ de texte dans la sous-classe Uiview, mais la transmission de données n'a aucun sens car Texteild fait de toute façon partie de UIViewController et vous pouvez accéder directement avec vous-même. comme self.yourCusotmView.textfield. La solution serait de conserver votre délégué textField à votre contrôleur de vue comme self.yourView.txtField1.delegate = self. afin que vous ayez plus de contrôle sur les données.


Deuxièmement, vous devez faire attention lorsque vous enregistrez votre texte dans userdefault afin de ne rien perdre dans aucun scénario



0
votes

L'appel formView.saveInputText () doit être appelé à partir de la fonction viewDidAppear () au lieu de la fonction viewDidLoad () .


0 commentaires

1
votes

Vous ne devez appeler que fetchInputText dans viewDidLoad juste pour définir le texte textFields à partir de UserDefaults . Actuellement, vous appelez handleSave qui appelle en interne saveInputText lorsque textFields n'a aucune valeur (ou valeur par défaut). Il peut planter si vous n'avez mis aucun texte par défaut dans Storyboard / Xib pour l'un de ces textFields .,

override func viewDidLoad() {
    super.viewDidLoad()
    formView.delegate = self

    fetchInputText()
}


1 commentaires

hé merci je ne sais pas comment mais ça marche :) @Kamran