所以我在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 {
}
}
答案 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-textfield和https://developer.apple.com/reference/foundation/nsnotification.name/1619640-uitextfieldtextdidchange)