簡體   English   中英

自定義委托nil且不保存userDefaults

[英]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,因此不需要傳遞值,這不是在這里正確使用委托

假設您無法執行此操作,那么每次調用textFieldShouldChangeCharactertextFieldDidEndEditing時都需要調用委托,但是正如我所說的那樣,這是錯誤的方式

步驟1:確認所有正確的信息都保存在其中

步驟2:UserDefault已經有方法來提取字符串

取代這個

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

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

和其他人。

你應該叫只fetchInputTextviewDidLoad只設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM