2016-12-07 16 views
1

Так что у меня проблемы с сохранением текстовых полей на USERDEFAULTS. Мне удалось использовать этот mehtod на моих контактах (как вы можете видеть мой код ниже), и когда я пытаюсь сохранить/загрузить мои текстовые поля, это не сработало. можете ли вы дать мне какие-либо советы. БлагодаряUserdefault не работает swift

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

Как это «не работает»? Неверные данные, авария, ...? - Вы, кажется, предполагаете, что didFinishLaunchingWithOptions вызывается * перед * viewDidLoad. Это не обязательно так, см., Например, http://stackoverflow.com/questions/32827625/viewcontrollers-viewdidload-called-before-appdelegates-method. –

ответ

0

Yo Вы не сохраняете эти значения. Вы установили делегаты для этих текстовых полей, и вы должны реализовать некоторые методы 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 соответственно)

+0

Спасибо, это очень помогло! –