因此,我在保存USERDEFAULTS上的文本域時遇到了問題。我已經設法在我的聯繫人上使用這個方法(因爲您可以在下面看到我的代碼),並且當我嘗試在我的文本字段中保存/加載時沒有工作。你能給我任何建議嗎?由於Userdefault無法正常工作
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在* viewDidLoad之前被稱爲*。這不一定是真實的,請參閱http://stackoverflow.com/questions/32827625/viewcontrollers-viewdidload-called-before-appdelegates-method。 –