Userdefault不能快速工作

时间:2016-12-07 05:52:58

标签: swift nsuserdefaults xcode8 userdefaults

所以我在USERDEFAULTS上保存文本字段时遇到了问题。我设法在我的联系人上使用这个mehtod(你可以在下面看到我的代码),当我尝试在我的文本域中保存/加载时没有工作。你能给我任何建议吗?感谢

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 {

        }

    }

1 个答案:

答案 0 :(得分:0)

您没有存储这些值。您已为这些文本字段设置了委托,您应该实现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-textfieldhttps://developer.apple.com/reference/foundation/nsnotification.name/1619640-uitextfieldtextdidchange