IOS,保存状态数据并从另一个视图控制器返回时恢复它

时间:2016-09-04 12:44:00

标签: ios swift xcode

我正在编写一些允许用户输入数据和更新数据的文本域。用户可以输入数据并点击保存按钮进行保存,当用户点击更新按钮时,文本字段上恰好出现信息供用户编辑。但是在一个文本字段中,用户必须单击旁边的按钮,将用户定向到另一个新的视图控制器,当用户返回到旧的视图控制器时,所有编辑的信息都已消失。我知道这是因为全局变量已被清理。有没有办法保存数据状态并从其他视图控制器返回后恢复它。非常感谢!!!!!!!!

这是我正在使用的代码(我使用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()
    }


}

1 个答案:

答案 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

祝你好运!