将表视图数据保存在 SWIFT MVC 中



我有这个代码。我正在开发没有情节提要的应用程序:

第二控制器.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
}}

第二视图.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时,我丢失了新的数据项。

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

谢谢

你说你回到FirstController,所以你的SecondControlleritems数组一起从内存中被销毁。如果要在整个应用中访问它们,则应创建一个模型类(根据您在问题标题中提到的 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:这种方式允许您仅在应用程序终止之前将数据存储在内存中。为了持久化它,您需要使用CoreData,SQLite属性列表等将其存储在磁盘上,如@f_qi建议的文章中所述。无论如何,您应该像DataStorage一样分离模型文件来管理此逻辑。

您没有实现任何数据持久性方法。
看看这个链接,它显示了几种保存数据的方法。
它是 2015 年的形式,所以你需要理解它并相应地应用 swift 3.1。

最新更新