[英]Custom delegate nil and not saving userDefaults
我在UIView中創建了一個委托,以將數據傳遞到控制器,然后將其保存在userdefaults中。 但是當我嘗試保存它時,它返回nil。 如何保存它而不返回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 Delegate設置為ViewController,因此不需要傳遞值,這不是在這里正確使用委托
假設您無法執行此操作,那么每次調用textFieldShouldChangeCharacter
或textFieldDidEndEditing
時都需要調用委托,但是正如我所說的那樣,這是錯誤的方式
步驟1:確認所有正確的信息都保存在其中
步驟2:UserDefault已經有方法來提取字符串
取代這個
let name = UserDefaults.standard.value(forKey: "nameTextFieldKey") as? String ?? ""
同
let name = UserDefaults.standard.string(forKey: "nameTextFieldKey") ?? ""
和其他人。
你應該叫只fetchInputText
在viewDidLoad
只設置textFields
從文本UserDefaults
。 當前,您正在調用handleSave
,當textFields
沒有值(或默認值)時,在內部調用saveInputText
。 如果您沒有在Storyboard/Xib
為這些textFields
任何一個添加任何默認text
,則可能會崩潰。
override func viewDidLoad() {
super.viewDidLoad()
formView.delegate = self
fetchInputText()
}
而且使用delegate
的目的似乎沒有意義,因為FormUIView
不會傳播任何要delegate
處理的內容。 這可能是錯誤的,因為我不知道FormUIView
的完整實現。
應該從viewDidAppear()
函數而不是viewDidLoad()
函數調用formView.saveInputText()
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.