我创建了一个UIViewController
,里面有两个UITexFields
和一个UIImageView
。
我希望它是一个个人资料页面,它提供可在应用程序中随处使用的信息。
我尝试做的是以下内容:
我使用此代码(基于Apple's tutorial on creating apps )创建了Class
:
import UIKit
Class ProfilClass: NSObject, NSCoding {
//MARK: Properties
var bild: UIImage?
var vorname: String
var geburt: String
//MARK: Archiving Paths
static let DocumentsDirectory = NSFileManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
static let ArchiveURL = DocumentsDirectory.URLByAppendingPathComponent("profil")
//MARK: Types
struct propKey {
static let bildKey = "bild"
static let vornameKey = "vorname"
static let geburtKey = "geburt"
}
//MARK: Initialization
init?(bild: UIImage?, vorname: String, geburt: String){
self.bild = bild
self.vorname = vorname
self.geburt = geburt
super.init()
if vorname.isEmpty || geburt.isEmpty {
return nil
}
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(bild, forKey: propKey.bildKey)
aCoder.encodeObject(vorname, forKey: propKey.vornameKey)
aCoder.encodeObject(geburt, forKey: propKey.geburtKey)
}
required convenience init?(coder aDecoder: NSCoder){
let bild = aDecoder.decodeObjectForKey(propKey.bildKey) as? UIImage
let vorname = aDecoder.decodeObjectForKey(propKey.vornameKey) as! String
let geburt = aDecoder.decodeObjectForKey(propKey.geburtKey) as! String
self.init(bild: bild, vorname: vorname, geburt: geburt)
}
}
我尝试在UIViewController
中使用此类:
override func viewDidLoad() {
[...]
if let profil = profil{
vornameLabel.text = profil.vorname
vornameField.text = profil.vorname
profilePic.image = profil.bild
geburtstagsLabel.text = profil.geburt
geburtstagField.text = profil.geburt
}
}
点击保存按钮时:
@IBAction func butTap(sender: UIBarButtonItem) {
let vorname = vornameField.text
let geburt = geburtstagField.text
let bild = profilePic.image
profil = ProfilClass(bild: bild, vorname: vorname!, geburt: geburt!)
}
但是在关闭UIViewController
后,回到另一个并重新打开它,所有信息都丢失了。
我不知道如何再次获取信息(我假设它被保存在某处)。
任何人都可以帮助我吗?
答案 0 :(得分:1)
最后你的错误就出现了:
我认为它被保存在某个地方
不是,除非你要求保存它。您需要使用NSUserDefaults
或NSKeyedArchiver
来编写对象。你已经编写了完成这项工作所需的所有代码,现在你只需要进行阅读和写作。
例如,要编写保存的数据,您需要这样的内容:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(profil, forKey: "SavedUserProfile")
我无法对阅读发表评论,因为您限制了发布的代码:
[...]
if let profil = profil{
这就是你的阅读代码应该发生的地方。我猜(!)你做的是这样的事情:
let defaults = NSUserDefaults.standardUserDefaults()
if let profil = defaults.objectForKey("SavedUserProfile") as? ProfilClass
正如您正在关注特定的Apple教程:您可能会发现继续关注它而不是尝试使用其他解决方案更容易。具体来说,您需要继续执行“保存并加载膳食列表”标题,这是实际保存和加载的位置。 Apple将数据写入磁盘而不是用户默认值,因此您应该遵循。
要明确:您编写的代码只能保存和加载您的对象。它实际上并没有做保存。
答案 1 :(得分:1)
public class MyViewState : NSObject{
static var isFromLogin = false
static var isFromCQ = false
}
将上面添加到任何视图控制器中的任何位置,它可以在任何地方访问,如
MyViewState.isFromLogin
答案 2 :(得分:1)
创建一个像下面这样的共享类将一直保存数据
Class ProfilClass: NSObject, NSCoding {
static let sharedInstance = ProfilClass()
// here methods etc will go
}
和
ProfilClass.sharedInstance.(properties or method)
如果你想在重新启动应用程序之后获得数据,那么将其保存到Userdefaults并再次加载此类并访问应用程序中的任何位置
答案 3 :(得分:0)
var isFromLogin = false
var isFromCQ = false
Class ProfilClass: NSObject, NSCoding {.......}
将以上内容添加到课程中,它将随处可见。或者还创建.swift文件并声明常量变量以全局访问