创建可在应用程序的任何位置使用的配置文件

时间:2015-12-15 11:51:28

标签: ios swift

我创建了一个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后,回到另一个并重新打开它,所有信息都丢失了。 我不知道如何再次获取信息(我假设它被保存在某处)。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

最后你的错误就出现了:

  

我认为它被保存在某个地方

不是,除非你要求保存它。您需要使用NSUserDefaultsNSKeyedArchiver来编写对象。你已经编写了完成这项工作所需的所有代码,现在你只需要进行阅读和写作。

例如,要编写保存的数据,您需要这样的内容:

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文件并声明常量变量以全局访问