自定义委托 nil 且不保存 userDefaults

Custom delegate nil and not saving userDefaults

我在 UIView 中创建了一个委托来将数据传递给我的控制器,然后将其保存在 userdefaults 中。但是当我尝试保存它时,它 return 为零。我怎样才能保存它而不是 return nil.

这是我在 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
}

我不明白你为什么使用委托来传递不必要的数据或者你做错了什么。

因为都是textfield所以你可以直接设置textField Delegate为ViewController所以不需要传递值&这不是delegate的正确使用这里

假设你不能这样做那么你需要在每次 textFieldShouldChangeCharactertextFieldDidEndEditing 时调用委托 打电话了,但正如我所说,这是错误的方式

第一步:验证里面保存的信息是否正确

第 2 步:UserDefault 已经有方法来获取字符串

替换此

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

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

还有其他人。

应从 viewDidAppear() 函数而不是 viewDidLoad() 函数调用调用 formView.saveInputText()

您应该只调用 viewDidLoad 中的 fetchInputText 来设置 UserDefaults 中的 textFields 文本。当前您正在调用 handleSave,当 textFields 没有值(或默认值)时,它在内部调用 saveInputText。如果您没有为这些 textFields.,

中的任何一个在 Storyboard/Xib 中设置任何默认值 text,它可能会崩溃
override func viewDidLoad() {
    super.viewDidLoad()
    formView.delegate = self

    fetchInputText()
}

并且使用 delegate 的目的看起来没有意义,因为 FormUIView 没有传播任何东西供 delegate 处理。这可能是错误的,因为我不知道 FormUIView.

的完整实现