我有这个代码。我在没有故事板的情况下开发我的应用程序:
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吗?
谢谢
答案 0 :(得分:1)
你说你回到FirstController
,所以你的SecondController
会随着items
阵列从内存中被摧毁。如果您希望在应用中访问它们,则应创建模型类(根据您在问题标题中提到的 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。无论如何,您应该将{strong>模型文件分开,如DataStorage
来管理此逻辑。
答案 1 :(得分:0)
您没有实施任何数据持久性方法
看一下 this 链接,它会显示几种方法来保存您的数据。
它是2015年的形式,因此您需要了解它并相应地应用swift 3.1。