为啥每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3
Posted
技术标签:
【中文标题】为啥每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3【英文标题】:why does my array overwrite itself every time i change view and go back to it - swift 3为什么每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3 【发布时间】:2017-03-23 03:25:07 【问题描述】:所以我有两个视图控制器。一个包含 tableView 以显示数组中的数据。第二个 viewController 用于在数组中添加东西。
这是我的 viewController 文件:
import UIKit
class ViewController: UIViewController
@IBOutlet weak var txtTitle: UITextField!
@IBOutlet weak var txtLocation: UITextField!
@IBOutlet weak var txtDate: UITextField!
@IBOutlet weak var txtTime: UITextField!
var eventsArray = [Event]()
override func viewDidLoad()
super.viewDidLoad()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
@IBAction func btnSave()
let newEvent = Event(eventTitle: txtTitle.text!, eventLocation: txtLocation.text!)
eventsArray.append(newEvent)
let savedEvents = NSKeyedArchiver.archivedData(withRootObject: eventsArray)
UserDefaults.standard.set(savedEvents, forKey: "savedEvents")
UserDefaults.standard.synchronize()
这是我的tableView:
import UIKit
class EventsTable: UIViewController, UITableViewDataSource, UITableViewDelegate
//var tableData = ViewController()
var events = [Event]()
@IBOutlet weak var table: UITableView!
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
// #warning Incomplete implementation, return the number of rows
return events.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomeCell
cell.title.text = events[indexPath.row].title
cell.location.text = events[indexPath.row].location
return cell
func retriveData()
if let data = UserDefaults.standard.object(forKey: "savedEvents") as? Data
if let storedData = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Event]
events = storedData
override func viewDidAppear(_ animated: Bool)
retriveData()
table.reloadData()
这是我的用户界面: main.storyboard
现在,每次我添加一个事件并返回到我的 tableView 时,即使我设置了自定义单元格,它也只会在单元格中显示标题(这是问题之一)。另一个问题,主要问题是,如果我回到我的 viewController 添加另一个事件,它会添加它但它会覆盖旧数组,它会显示我添加的最新事件并替换旧事件,并且只显示我添加的新事件在 tableView 中添加。我不知道这里发生了什么。我感觉每次点击“保存”按钮都会创建一个新数组?
目前我只实现了 eventTitle 和 eventLocation。
如果你们都无法理解我的意思,这里是我的项目的链接 https://mega.nz/#!XBxU1Q5J!cAhpRrZJo7an4ab8HmD1HtH7GSisScKOGoykGm9orJo
【问题讨论】:
retriveData() 只需在 viewdidload 中调用此方法,因此您的数组中没有重复 【参考方案1】:归档数据和检索归档数据将具有不同的内存引用。如果您再次保存,它将替换旧的。
而且频繁地使用应用程序的沙盒将是一个昂贵的过程。
理想情况下,您必须在 TableViewController 类中初始化一个数组。 将此数组引用传递给 ViewController。 在同一数组中添加/编辑/删除对象。回到 TableViewController 并刷新表格视图。
一般规则是在两个控制器中拥有相同的数组引用,并在需要时将其保存/检索到应用程序的沙箱之外。
现在点保存和检索您可以通过以下任一方式进行:
手动:保留一个按钮以将数组保存在应用沙箱中。并在需要时检索它。
将数组保存在 AppDelegate 的 didEnterInBackground 方法中,并在 foreGround 方法中检索。你需要有一些机制来获取 AppDelegate 中 eventArray 的引用。
希望这会有所帮助!
【讨论】:
感谢您的回答。我不确定您所说的“沙盒”一词是什么意思。另外,您是否可以通过代码显示如何解决我的问题?再次感谢! 沙盒是应用程序的目录结构所在的位置。您保存在目录或 userDefaults 中的所有内容都进入应用程序的沙箱。 ***.com/questions/12055990/… 谢谢!请问您可以通过代码显示如何解决我的问题吗?抱歉,我是新手,不胜感激!以上是关于为啥每次我更改视图并返回它时我的数组都会覆盖自身 - swift 3的主要内容,如果未能解决你的问题,请参考以下文章
为啥每次我在这个特定数据集上运行 train-test split 时我的内核都会死掉?
React Native 为啥每次点击 textInput 时我的键盘都会立即消失?