Пользовательский делегат ноль и без сохранения userDefaults - PullRequest
0 голосов
/ 02 января 2019

Я создаю делегат внутри UIView для передачи данных на мой контроллер, а затем сохраняю их в пользовательских ошибках.но когда я пытаюсь сохранить его, он возвращает ноль.Как я могу сохранить его и не возвращать ноль.

это мой код в UIView и мой протокол

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")

это мой код контроллера, у которого есть кнопка для сохранения введенного текста и сохраненияэто в userdefaults

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
}

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Вызов formView.saveInputText() следует вызывать из функции viewDidAppear() вместо функции viewDidLoad().

0 голосов
/ 02 января 2019

Вы должны вызывать только fetchInputText в viewDidLoad, чтобы установить текст textFields из UserDefaults. В настоящее время вы звоните handleSave, который внутренне вызывает saveInputText, когда textFields не имеет значений (или значений по умолчанию). Может произойти сбой, если вы не указали значение text в Storyboard/Xib по умолчанию для любого из этих textFields.,

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

    fetchInputText()
}

И цель использования delegate не выглядит осмысленной, потому что FormUIView ничего не распространяет для обработки delegate. Это может быть неправильно, так как я не знаю полной реализации FormUIView.

0 голосов
/ 02 января 2019

Я не понимаю, почему вы используете делегат для передачи ненужных данных или делаете что-то не так.

Поскольку все являются текстовым полем, вы можете непосредственно установить textField Delegate в ViewController Так что нет необходимости передавать значение вокруг, и это неправильное использование делегата здесь

Предположим, что вы не можете сделать это, тогда вам нужно вызывать делегат каждый раз, когда textFieldShouldChangeCharacter или textFieldDidEndEditing Называется, но, как я уже сказал, это неправильный путь

Шаг 1: убедитесь, что вся правильная информация сохранена внутри

Шаг 2: UserDefault уже имеет метод для извлечения строки

Заменить

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

с

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

и другие тоже.

...