overrIDe func vIEwDIDAppear(_ animated: Bool) { let itemsObject = UserDefaults.standard.object(forKey: "items") if let tempItems = itemsObject as? [String] { items = tempItems}
在(视图控制器2)中:
overrIDe func prepare(for segue: UIStoryboardSegue,sender: Any?) { if segue.IDentifIEr == "toSecondVIEwController" { let itemsObject = UserDefaults.standard.object(forKey: "items") var items:[String] if let tempItems = itemsObject as? [String] { items = tempItems items.append(textFIEld.text!) print(items) } else { items = [textFIEld.text!] } UserDefaults.standard.set(items,forKey: "items") }}
我试图在VC2上的数组中添加一个项目.然后我想将数组传输到VC1,同时也永久存储它.然后每次我关闭并重新加载应用程序时,我都可以打印数组.错误消息指出“使用未解析的标识符项”.我正在使用Xcode 8.0和Swift 3.0.
解决方法 好的,因为您说要在应用程序启动时保留数据,您将需要用户默认值来存储您的项目.正如Dan已经建议你基本上做得对.您只想设置之前未声明的变量.但我会在下面的代码中向您展示.我还将附加第二种方法,在执行segue时将项目传递给下一个视图控制器.第一个例子:想象一下,我们在你的例子中有两个视图控制器.第一个视图控制器包含一个UITextFIEld来执行用户文本输入.每当我们在故事板segue的帮助下从第一个视图控制器切换到第二个视图控制器时(例如,当按下按钮时),我们从用户默认值中获取先前segue中的现有文本并添加当前用户输入然后再保留到用户默认值.这发生在第一个视图控制器中:
class VIEwController: UIVIEwController {@IBOutlet weak var textFIEld: UITextFIEld!overrIDe func prepare(for segue: UIStoryboardSegue,sender: Any?) { super.prepare(for: segue,sender: sender) if segue.IDentifIEr == "toSecondVIEwController" { let itemsFromDefaults = UserDefaults.standard.object(forKey: "items") var items: [String] if let tempItems = itemsFromDefaults as? [String] { items = tempItems items.append(textFIEld.text!) } else { items = [textFIEld.text!] } print(items) UserDefaults.standard.set(items,forKey: "items") }}}
第一个视图控制器看起来与您的代码非常相似,但我想添加它以保证完整性.
然后在第二个视图控制器中,我们只从用户默认值中获取项目,并将其直接存储在此视图控制器的实例变量中.借助于此,我们可以在视图控制器中的其他方法中执行我们想要的 *** 作,并进一步处理项目.正如我所说,你所缺少的是用于存储项目的实例变量声明.
class VIEwController2: UIVIEwController {private var items: [String]? // This is only accessible privatelyoverrIDe func vIEwDIDAppear(_ animated: Bool) { super.vIEwDIDAppear(animated) self.items = UserDefaults.standard.object(forKey: "items") as? [String]}}
第二个示例:您还可以在VIEwController2中声明一个内部/公共变量,以便您可以在执行segue中直接从第一个视图控制器设置它.您不需要从VIEwController2中的用户默认值中获取项目.为此,您可以访问segue的目标视图控制器,然后将其转换为VIEwController2并直接设置它的项目.
class VIEwController: UIVIEwController {@IBOutlet weak var textFIEld: UITextFIEld!overrIDe func prepare(for segue: UIStoryboardSegue,sender: sender) if segue.IDentifIEr == "toSecondVIEwController" { let itemsFromDefaults = UserDefaults.standard.object(forKey: "items") var items: [String] // [...] Do the stuff to get the items and add current input like before [...] let destinationVIEwController = segue.destination as! VIEwController2 destinationVIEwController.items = items }}}class VIEwController2: UIVIEwController {var items: [String]? // This is accessible from outsIDe NowoverrIDe func vIEwDIDAppear(_ animated: Bool) { super.vIEwDIDAppear(animated) print(items) // We can Now print this because it is set in prepareForSegue}}
我真的希望我可以帮助你并解释它是可以理解的.如果您有任何疑问,请随时发表评论.
总结以上是内存溢出为你收集整理的数组 – 永久数据和准备争夺全部内容,希望文章能够帮你解决数组 – 永久数据和准备争夺所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)