用户默认不能快速工作

Posted

技术标签:

【中文标题】用户默认不能快速工作【英文标题】:Userdefault not working swift 【发布时间】:2016-12-07 05:52:57 【问题描述】:

所以我无法在 USERDEFAULTS 上保存我的文本字段。我设法在我的联系人上使用了这个方法(你可以在下面看到我的代码),当我尝试在我的文本字段上保存/加载时不起作用。你能给我任何建议吗?谢谢

PBProfile.Swift

class PBProfile 

    var firstName: String = ""
    var lastName: String = ""
    var contacts = [String]()

    func loadFromDefaults() 
        let defaults = UserDefaults.standard
        firstName = defaults.string(forKey: "firstName") ?? ""
        lastName = defaults.string(forKey: "lastName") ?? ""
        contacts = defaults.stringArray(forKey: "contacts") ?? [String]()

    

    func saveToDefaults() 
        let defaults = UserDefaults.standard
        defaults.set(firstName, forKey: "firstName")
        defaults.set(lastName, forKey: "lastName")
        defaults.set(contacts, forKey: "contacts")
        defaults.synchronize()
    


AppDelegate

    var profile: PBProfile!
    var location: PBLocation!

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

        FIRApp.configure()

        profile = PBProfile()
        profile.loadFromDefaults()
        profile.saveToDefaults()

        location = PBLocation()

        return true
   


Settings.swift

import Foundation
import ContactsUI
import Contacts

class Settings: UIViewController, CNContactPickerDelegate, UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource 

    //VARIABLES
    var saveButtonSelected: UIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var firstName: UITextField!
    @IBOutlet weak var lastName: UITextField!
    //--- End of Variables --

    // -- ViewDidLoad --
    override func viewDidLoad() 
        super.viewDidLoad()

        self.navigationItem.setHidesBackButton(true, animated: false)
        self.hideKeyboardWhenTappedAround()

        firstName.delegate = self
        lastName.delegate = self

        tableView.reloadData()

        firstName.text = app.profile.firstName
        lastName.text = app.profile.lastName

        app.profile.loadFromDefaults()
    
    //-- End of ViewDidLoad

    //Prepare for segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        app.profile.saveToDefaults()

    


    //MARK -> ADD CONTACTS BUTTON
    @IBAction func addContactsSelected(_ sender: AnyObject) 

        _ = CNContactPickerViewController()
        let contactPicker = CNContactPickerViewController()
        contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey]
        contactPicker.delegate = self

        contactPicker.predicateForSelectionOfContact = NSPredicate (value:false)
        contactPicker.predicateForSelectionOfProperty = NSPredicate(value: true)
        self.present(contactPicker, animated: true, completion: nil)
    

    //MARK -> WHEN A CONTACT IS SELECTED
    func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) 

        let newitem = contactProperty.value as! CNPhoneNumber
        app.profile.contacts.append(newitem.stringValue)
        app.profile.saveToDefaults()
        tableView.reloadData()

    

    //MARK -> TABLEVIEW
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return  app.profile.contacts.count

    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
        cell!.textLabel?.text = app.profile.contacts[indexPath.row]
        return cell!
    

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
        if editingStyle == .delete 
            app.profile.contacts.remove(at: indexPath.row)
            app.profile.saveToDefaults()
            tableView.deleteRows(at: [indexPath], with: .fade)
         else if editingStyle == .insert 

        

    

【问题讨论】:

它是如何“不工作”的?错误的数据,崩溃,...? – 您似乎假设 didFinishLaunchingWithOptions 被调用 before viewDidLoad。这不一定是真的,例如参见***.com/questions/32827625/…。 【参考方案1】:

您没有存储这些值。您已经为这些文本字段设置了委托,并且您应该实现 UITextFieldDelegate 的一些方法。例如:

func textFieldDidEndEditing(_ textField: UITextField) 
    if textField == firstName 
        app.profile.firstName = textField.text
     else if textField == lastName 
        app.profile.lastName = textField.text
    

(https://developer.apple.com/reference/uikit/uitextfielddelegate/1619591-textfielddidendediting)

请注意,这只会在文本字段完成编辑时存储值(例如,您点击另一个文本字段,然后焦点移至该文本字段)。如果您想在值更改时存储值,可以使用委托的textField(_:shouldChangeCharactersIn:replacementString:) 函数或UITextFieldTextDidChange 通知(分别为https://developer.apple.com/reference/uikit/uitextfielddelegate/1619599-textfield 和https://developer.apple.com/reference/foundation/nsnotification.name/1619640-uitextfieldtextdidchange)

【讨论】:

感谢它真的有帮助!

以上是关于用户默认不能快速工作的主要内容,如果未能解决你的问题,请参考以下文章

请教:如何限制SYBASE登录,条件是用户名默认SA 口令空 不能修改

如何快速创建一组用户默认值?

使用 OpenResty Docker 镜像快速搭建 Web 服务器

如何在没有参数的情况下快速将类保存到用户默认值

CURRENT_DATE/CURDATE() 不能作为默认 DATE 值工作

快速更改默认全局色调颜色