我正在尝试使用表格视图编写一个简单的应用程序,以显示一些要做的事情。 (在这种情况下,它被称为“Grails”/我想买的东西)。
我做了关于表视图和输入等的所有事情,我唯一需要做的就是再次保存和加载所有信息。但我不知道如何。
这是我在第一个视图Controller上的代码:
import UIKit
var list = ["Nike Air Jordan 1 x Off White", "Balenciaga Speed Trainers", "Gucci Snake Sneakers", "Goyard Card Holder"]
class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var myTableView: UITableView!
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return list.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
cell.textLabel?.text = list[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
list.remove(at: indexPath.row)
myTableView.reloadData()
}
}
override func viewDidAppear(_ animated: Bool) {
myTableView.reloadData()
}
}
第二个视图控制器如下所示:
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var input: UITextField!
@IBAction func addItem(_ sender: Any) {
if (input.text != "") {
list.append(input.text!)
input.text = ""
}
}
}
编辑:
现在代码看起来像这样,但是我无法从第二个视图控制器上的按钮向列表中添加任何新项目?
导入UIKit
var list = [“Nike Air Jordan 1 x Off White”,“Balenciaga Speed Trainers”,“Gucci Snake Sneakers”,“Goyard Card Holder”]
类FirstViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {
@IBOutlet weak var myTableView: UITableView!
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return (list.count)
}
func updateData() {
UserDefaults.standard.set(list, forKey: "list")
myTableView.reloadData()
}
//LOADING THE DATA AGAIN
override func viewDidLoad() {
if let storedList = UserDefaults.standard.value(forKey: "list")
{
list = storedList as! [String]
}
else
{
print("No list previously stored")
}
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
cell.textLabel?.text = list[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
{
if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
}
else
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
}
}
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool
{
return true
}
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)
{
let item = list[sourceIndexPath.row]
list.remove(at: sourceIndexPath.row)
list.insert(item, at: destinationIndexPath.row)
}
@IBAction func edit(_ sender: Any)
{
myTableView.isEditing = !myTableView.isEditing
switch myTableView.isEditing {
case true:
editButtonItem.title = "Done"
case false:
editButtonItem.title = "Edit"
}
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
{
if editingStyle == UITableViewCellEditingStyle.delete
{
list.remove(at: indexPath.row)
updateData()
}
}
override func viewDidAppear(_ animated: Bool) {
updateData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
答案 0 :(得分:0)
好的,正如上面的评论中所述,在这种情况下你很可能会使用UserDefaults.standard
,因为它只是你正在处理的少量数据。如果您希望每次更新数据时都要更新数据(添加/删除新项目),那么您应该进行一些代码重构,以便将保存部分包含在myTableView.reloadData()
旁边。这是你如何做到的:
func updateData() {
UserDefaults.standard.set(list, forKey: "list")
myTableView.reloadData()
}
然后,您将在调用updateData()
的任何地方调用myTableView.reloadData()
(因此我明确表示:替换它,因为该方法已包含 reload 部分)。那是节省的部分。现在你必须处理 loading ,通常你会在AppDelegate
方法的application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
类中执行此操作,但为了简单起见,我们只是教你如何在你内部完成它'em> FirstViewController 类中已经缺少viewDidLoad()
方法:
override func viewDidLoad() {
if let storedList = UserDefaults.standard.value(forKey: "list") {
list = storedList as! [String]
} else {
print("No list previously stored")
}
}
如果存储了任何先前的list
,则替换该值。否则它会将消息打印为确认消息(如果需要,可以在将来删除它,以便保持控制台日志中的有用内容)。
我必须说的最后一件事就是我使用storedList
进行了强制转换,因为我知道它是一个String
数组,但你应该是小心使用as!
非常小心。始终执行安全铸造,因为如果失败,您的应用程序将崩溃。