自定义委托 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的正确使用这里
假设你不能这样做那么你需要在每次 textFieldShouldChangeCharacter
或 textFieldDidEndEditing
时调用委托
打电话了,但正如我所说,这是错误的方式
第一步:验证里面保存的信息是否正确
第 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
.
的完整实现
我在 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的正确使用这里
假设你不能这样做那么你需要在每次 textFieldShouldChangeCharacter
或 textFieldDidEndEditing
时调用委托
打电话了,但正如我所说,这是错误的方式
第一步:验证里面保存的信息是否正确
第 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
.