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")
3 Réponses :
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.
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
L'appel formView.saveInputText ()
doit être appelé à partir de la fonction viewDidAppear ()
au lieu de la fonction viewDidLoad ()
.
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() }
hé merci je ne sais pas comment mais ça marche :) @Kamran
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 UserDefaultsPouvez-vous mettre plus de code lié à la façon dont vous avez appelé
saveInputText
etfetchInputText
?@Kamran je mets à jour ma question vérifie-la