用户默认不能快速工作
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 服务器