杀死/退出应用程序后,如何在 UITableView 中使用 NSUserDefaults 显示自定义单元格,Xcode Swift

Posted

技术标签:

【中文标题】杀死/退出应用程序后,如何在 UITableView 中使用 NSUserDefaults 显示自定义单元格,Xcode Swift【英文标题】:How to show custom cells using NSUserDefaults in UITableView after killing/quitting application, Xcode Swift 【发布时间】:2016-06-03 21:48:14 【问题描述】:

我创建了一个任务应用程序,在一个视图控制器 (AddPlan.swift) 中我输入了 4 个字符串,然后将这 4 个字符串保存到另一个视图控制器 (ViewController.swift) 内的表视图中。一切都在按计划进行,但是我希望即使我杀死应用程序也能呈现已经创建的表格视图单元格。我看过教程,但是没有教程显示如果它是自定义单元格如何保存单元格。我知道你可以使用 NSUserDefaults 但我没有运气。

这是与我的问题相关的 AddPlan.swift 文件

class addPlan: UIViewController, UITextFieldDelegate 


var time: Int = 6


@IBOutlet var txt: UITextField!


@IBOutlet var Complete: UIImageView!


@IBOutlet var btn7: UIButton!
@IBOutlet var btn6: UIButton!
@IBOutlet var txt3: UITextField!
@IBOutlet var txt2: UITextField!
@IBOutlet var txt1: UITextField!
@IBOutlet var Button02: UIBarButtonItem!

override func viewDidLoad() 



    self.txt.delegate = self;
    self.txt1.delegate = self;
    self.txt2.delegate = self;
    self.txt3.delegate = self;







func textFieldShouldReturn(textField: UITextField) -> Bool 
    self.view.endEditing(true)
    return false


func dismissKeyboard() 
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)



@IBAction func ClickedforSelection(sender: AnyObject) 
    taskMgr.addTask(txt.text!, desc: txt1.text!, date: txt2.text!, clas: txt3!.text!)
    self.view.endEditing(true)
    txt.text = ""
    txt1.text = ""
    txt2.text = ""
    txt3.text = ""

这是与我的问题相关的 ViewController.swift

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)

    if(editingStyle == UITableViewCellEditingStyle.Delete)
        taskMgr.tasks.removeAtIndex(indexPath.row)
        NSUserDefaults.standardUserDefaults().setObject(taskMgr, forKey: "list")
        tbl?.reloadData();
    




override func viewWillAppear(animated: Bool) 
    tbl?.reloadData();


override func viewWillDisappear(animated: Bool) 





func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    if (self.resultSearchController.active)
    
        return self.filteredAppleProducts.count
    
    else
    
        return taskMgr.tasks.count
    


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
    UITableViewCell

        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableView

        cell.lbl.text = taskMgr.tasks[indexPath.row].name
        cell.lbl2.text = taskMgr.tasks[indexPath.row].desc
        cell.lbl4.text = taskMgr.tasks[indexPath.row].date
        cell.lbl3.text = taskMgr.tasks[indexPath.row].clas

        return cell


这是我的 ViewController.swift 文件的 ViewDidLoad

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.\
    text.enabled = false


    self.tbl?.delegate = self
    self.tbl?.dataSource = self

    if NSUserDefaults.standardUserDefaults().objectForKey("list") != nil 




     


    tbl!.separatorStyle = UITableViewCellSeparatorStyle.None
    tbl!.backgroundColor = UIColor(red: 239 / 255.0, green: 239 / 255.0, blue: 239 / 255.0, alpha: 1.0)

我的 TaskMgr.tasks 来自这个文件..

import UIKit

var taskMgr: TaskManager = TaskManager()

struct task
  var name = "Un-Named"
  var desc = "Un-Described"
  var date = "Un-Described"
  var clas = "Un-Described"



class TaskManager: NSObject 

var tasks = [task]()

func addTask(name: String, desc: String, date: String, clas: String)
    tasks.append(task(name: name, desc: desc, date: date, clas: clas))
  

再次澄清一下,我的应用有 2 个视图控制器,其中一个 (AddPlan.swift) 有 4 个 UITextFeild 和一个按钮。我在该文本字段中输入单词,如果我按下按钮,这些单词就会被传输到另一个视图控制器 (ViewController.swift) 中的 UITableView。然后这些单词会显示在一个单元格中。我想知道的是如何对单元格进行编码,以便在我退出/终止应用程序时,如果我重新打开应用程序,它们仍然会显示出来。

【问题讨论】:

【参考方案1】:

您的问题是XY problem

您说“即使我终止应用程序,我也希望保存单元格中的文本,例如 lbl,lbl1,lbl2,lbl3。”

你想错了。表格视图单元格是 MVC 设计模式中的视图对象。它们向用户显示信息并与用户交互。他们不存储信息。数据存储在模型中(通常是一个数组。)在您的情况下,它看起来像 taskMgr.tasks 包含您正在显示到表视图的数据数组。如果用户更改了单元格中的数据,那么您应该立即保存这些更改,或者直接保存到taskMgr.tasks[row],或者保存到一些临时的更改数组,以便您可以支持撤消。

无论如何,你需要弄清楚的是如何保存你的模型数据。为了帮助您,您需要详细说明您的模型。

我看到您打开了一个包含更多信息的重复问题。不要那样做。编辑您的原始问题以提供有关您的模型、模型的创建方式以及您当前为加载/保存该模型数据所做的任何操作的信息。

请注意,用户默认设置可能不是一个好的选择。它旨在保存少量的简单数据。存储大量易失性数据不是一个好主意。另一种存储形式可能是更好的选择,但您没有向我们提供足够的信息来提出建议。

【讨论】:

按型号,你的意思是使用CoreData吗?另外,即使我杀死了应用程序,我也希望保存 UITableView 的单元格,您对如何快速执行此操作有任何建议吗? 模型是一个概念。它是您的应用程序中负责保存您的应用程序数据的任何逻辑结构。有时模型只是在内存中。有时它会使用 Core Data、用户默认值或其他方法保存到磁盘。单元格不保存数据。他们展示了它。短语“我只想保存 UITableView 的单元格......”表明您正在考虑这个错误。单元格不保存数据。 我明白了,好吧我编辑了它,但是即使我终止应用程序,我仍然需要一种方法来呈现单元格,因为如果我终止应用程序,单元格不会显示,我希望它显示是。 你需要解释一下。你的 taskMgr.tasks 数据结构来自哪里?它最初是如何填充的?用户输入?你是说如果用户输入数据,然后你杀了应用程序,用户输入就丢失了吗?您需要提供更多信息(编辑您的问题,不要在 cmets 中这样做。) 请检查上面的编辑,总而言之,谢谢你到目前为止帮助我,非常感谢:)【参考方案2】:

在您提供的代码中,没有调用保存任何可能是您的问题原因的信息。通常,您会将数据保存到 NSUserDefaults 类似:

NSUserDefaults.standardUserDefaults().setObject(taskMgr.tasks[indexPath.row].name, forKey: "taskName")

也许看看How to save data of a game 以获得有关 NSUserDefaults 的一些帮助。

【讨论】:

那么如果我使用你提供的那行代码,我应该把它放在哪里呢? 以及如何调用它以便保存数据 您能否提供更多有关如何执行此操作的信息?以及检查上面的编辑。

以上是关于杀死/退出应用程序后,如何在 UITableView 中使用 NSUserDefaults 显示自定义单元格,Xcode Swift的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio - 如何(关闭,退出,退出,杀死等)应用程序[重复]

如何在linux中使用shell脚本杀死进程时获取退出代码=0

如何杀死一个应用程序的所有活动? [复制]

如何杀死每天在特定时间以“单一应用模式”运行的 iOS 应用? [关闭]

如何在LinuxShell中强制python退出

如何在LinuxShell中强制python退出