gpt4 book ai didi

ios - 在 Swift MVC 中保存 TableView 数据

转载 作者:行者123 更新时间:2023-11-28 15:45:41 24 4
gpt4 key购买 nike

我有这个代码。我正在开发没有 Storyboard的应用程序:

SecondController.swift

class SecondController: UIViewController {

var items: [String] = ["DATA 1", "DATA 2", "DATA 3"]
let tableView: UITableView = UITableView()

init(){
super.init(nibName: nil, bundle: nil)
self.view = SecondView()
self.view.backgroundColor=UIColor.green

tableView.frame = CGRect(0, 50, 320, 200);
tableView.delegate = self
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
self.view.addSubview(tableView)
}

override var prefersStatusBarHidden: Bool {
return true
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}

func onClickListener(object : UIButton!) {
self.navigationController!.popViewController(animated: false)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
}}
extension SecondController: UITableViewDataSource, UITableViewDelegate {

func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
return self.items.count
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("You selected cell #\(indexPath.row)!")
items.append("NEW DATA")
print(items.count)
self.tableView.reloadData()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.textLabel?.text = self.items[indexPath.row]
return cell
}}

和SecondView.swift

class SecondView: UIView {
var btnImage = UIButton(image: "resume")

override init(frame: CGRect){
super.init(frame: screenSize)
self.backgroundColor = UIColor.black

// Btn
self.btnImage.translatesAutoresizingMaskIntoConstraints = false
addSubview(self.btnImage)
self.btnImage.alignLeftOfViewVoid(padding: 1)
self.btnImage.addTarget(self.parentViewController, action: #selector (SecondController.onClickListener(object:)), for: .touchUpInside)

}


required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

deinit{
self.removeFromSuperview()
}}

该表工作得很好,但是当我按下按钮时,应用程序返回到 FirstView 和 FirstController,而当我想返回到 SecondView 和 SecondController 时,我丢失了新的数据项。

如果我不想丢失数组数据,我应该把它们放在哪里?我可以在另一个文件中分离 TableView 吗?

谢谢

最佳答案

你说你回到 FirstController,所以你的 SecondController 连同 items 数组从内存中被销毁。如果你想让它们在整个应用程序中访问,你应该创建一个 Model 类(根据你在问题标题中提到的 MVC 模式)。

class DataStorage {
static let shared = DataStorage()
var items: [String] = ["DATA 1", "DATA 2", "DATA 3"]
}

现在您可以像这样从您的 SecondController 访问此数据:

func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
return DataStorage.shared.items.count
}

当然,这是粗略的实现,您很可能需要在 DataStorage 类中实现一组方法来修改(创建、更新、删除)您的 items.

UPD:这种方式让您只能在应用程序终止之前将数据存储在内存中。为了持久化它,您需要使用 CoreDataSQLiteProperty Lists 等将其存储在磁盘上,如@建议的文章中所述f_qi。无论如何,您应该像 DataStorage 这样分离 Model 文件来管理这个逻辑。

关于ios - 在 Swift MVC 中保存 TableView 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43097606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com