我正在编写一些允许用户输入数据和更新数据的文本域。用户可以输入数据并点击保存按钮进行保存,当用户点击更新按钮时,文本字段上恰好出现信息供用户编辑。但是在一个文本字段中,用户必须单击旁边的按钮,将用户定向到另一个新的视图控制器,当用户返回到旧的视图控制器时,所有编辑的信息都已消失。我知道这是因为全局变量已被清理。有没有办法保存数据状态并从其他视图控制器返回后恢复它。非常感谢!!!!!!!!
这是我正在使用的代码(我使用sqlite来存储信息):
import Foundation
class DeliveryInfoVC: UIViewController,UITableViewDelegate,UITableViewDataSource {
@IBOutlet weak var addressLabel: UITextField!
@IBOutlet weak var phoneLabel: UITextField!
@IBOutlet weak var nickNameLabel: UITextField!
@IBOutlet weak var tableView: UITableView!
var userID:Int=0
var address=[String]()
var deliverDataObject:[DeliverDataObject]=[]
var deliverInfoDBHandler=DeliverInfoDBHandler()
var isInUpdate:Bool=false
var buttonColor:UIColor=UIColor.yellowColor()
var accountID:Int64=0
@IBAction func addNewAdd(sender: AnyObject) {
}
@IBAction func infoSave(sender: AnyObject) {
if phoneLabel.text=="" || addressLabel.text=="" {
let alert = UIAlertController(title: "Can not save the data", message: "Please input the contact number or address", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}else if isInUpdate{
deliverInfoDBHandler.UpdatedelivertableData(accountID, address_NickName: nickNameLabel.text!, delivery_Address: addressLabel.text!, contact_Number: phoneLabel.text!, is_InUpdate: false)
addressLabel.text=""
phoneLabel.text=""
nickNameLabel.text=""
address=[]
self.viewDidLoad()
tableView.reloadData()
}else{
let rowid = deliverInfoDBHandler.SetdelivertableData(userID, address_NickName: nickNameLabel.text!, delivery_Address: addressLabel.text!, contact_Number: phoneLabel.text!, is_InUpdate: false)
print(rowid)
deliverDataObject=deliverInfoDBHandler.GetdelivertableData(userID)
tableView.reloadData()
addressLabel.text=""
phoneLabel.text=""
nickNameLabel.text=""
}
}
override func viewDidLoad() {
tableView.dataSource = self
tableView.delegate = self
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
userID=prefs.integerForKey("USERID")
addressLabel.text=address.joinWithSeparator(",")
print(address)
deliverInfoDBHandler.ConnectionandCreatingTable()
deliverDataObject=deliverInfoDBHandler.GetdelivertableData(userID)
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete {
let rowid=deliverDataObject[indexPath.row].deliverAccountID
deliverDataObject.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
deliverInfoDBHandler.DeletedelivertableRowData(rowid)
tableView.reloadData()
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return deliverDataObject.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! DeliveryInfoCell
cell.savedaddLabel.text = deliverDataObject[indexPath.row].address
cell.cellNickLabel.text = deliverDataObject[indexPath.row].addressNickName
cell.updateButton.tag = indexPath.row
cell.updateButton.addTarget(self, action: #selector(DeliveryInfoVC.UpdateButtonClicked(_:)), forControlEvents: UIControlEvents.TouchUpInside)
cell.updateButton.backgroundColor=buttonColor
return cell
}
func UpdateButtonClicked(sender:UIButton){
let buttonRow = sender.tag
addressLabel.text = deliverDataObject[buttonRow].address
phoneLabel.text = deliverDataObject[buttonRow].contactNo
nickNameLabel.text = deliverDataObject[buttonRow].addressNickName
buttonColor = UIColor.redColor()
isInUpdate = true
deliverDataObject[buttonRow].isInUpdate=true
accountID = deliverDataObject[buttonRow].deliverAccountID
tableView.reloadData()
}
}
答案 0 :(得分:1)
您遇到的问题是您没有持久存储空间。在iOS中,如果设备上没有存储某些内容,则一旦离开View Controller,它就会很容易丢失。
更确切地说,当保存它们的对象被解除分配时,或者当它们的值以某种方式明显改变时,变量会丢失它们的值。
例如,某些segue类型可能会创建VC的新实例,从而导致数据丢失。永久存储值可以绕过这些问题。
就持久存储而言,有以下几种选择:
1)使用在线数据库(虽然需要WiFi)
2)使用NSUserDefaults(容易持久存储以获取相当小的信息:避免图像)
3)核心数据(设备上的持久存储:更复杂但功能更强大)
我建议从NSUserDefaults开始,因为这很容易学习。
以下是您可以写入NSUserDefaults的方法:
在这个例子中,我使用一个字符串数组来解释,但这同样适用于任何其他形式的数据。
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(myArray, forKey: "arrayKey")
这就是你可以检索数据的方法:
var retrievedArray = defaults.objectForKey("arrayKey") as [String]
我假设它是一个字符串数组。 因此,当您向数组添加数据时,将其存储在NSUserDefaults中,然后,当您需要检索数据时,从那里获取数据。
此外,这将允许您在其他ViewControllers以及应用程序终止后访问此信息。换句话说,数据是留下来的。您当然可以覆盖它,也可以通过删除应用程序将其删除。
有关详细信息,请查看以下内容: https://www.hackingwithswift.com/read/12/2/reading-and-writing-basics-nsuserdefaults
祝你好运!