2014-09-28 3 views
2

NSCoding에서이 흑색 코드가 발견되어 거의 필요로합니다. 내가 찾은 곳의 링크는 아래에 있습니다. 다른 클래스에서 NSCoding 클래스와 사용자를 어떻게 만듭니 까? 아래 코드는 작동하지 않습니다. 나는 이것으로 나를 도울 수 있기를 바랍니다.SWIFT NSCoding Subclass를 만들고 다른 클래스에서 호출하는 방법?

import Foundation 
import UIKit 


class User: NSObject, NSCoding { 
    var name: String 

    init(name: String) { 
     self.name = name 
    } 

    required init(coder aDecoder: NSCoder) { 

     self.name = aDecoder.decodeObjectForKey("name") as String 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(name, forKey: "name") 
    } 
} 


//new class where I want to set and get the object 

class MyNewClass: UIViewController { 

    let user = User(name: "Mike") 
    let encodedUser = NSKeyedArchiver.archivedDataWithRootObject(user) 
    let decodedUser = NSKeyedUnarchiver.unarchiveObjectWithData(encodedUser) as User 

} 

//http://stackoverflow.com/questions/24589933/nskeyedunarchiver-fails-to-decode-a-custom-object-in-swift 

답변

3

내 프로젝트에서 잘라내어 붙여 넣습니다. 파일에 저장할 문자열 매개 변수를 하나만 제한했습니다. 그러나 당신은 다른 유형의 더 많은 것을 할 수 있습니다. 이 파일을 하나의 빠른 파일에 붙여넣고 ViewController로 사용하고 테스트 할 클래스를 추가 할 수 있습니다. 신속한 구문으로 NSCoding을 사용하여 개체의 데이터를 저장 및 검색하는 방법을 보여줍니다.

import UIKit 
import Foundation 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var instanceData = Data() 
     instanceData.name = "testName" 
     ArchiveData().saveData(nameData: instanceData) 
     let retrievedData = ArchiveData().retrieveData() as Data 
     println(retrievedData.name) 

    } 
} 

class Data: NSObject { 

    var name: String = "" 

    func encodeWithCoder(aCoder: NSCoder!) { 
     aCoder.encodeObject(name, forKey: "name") 
    } 

    init(coder aDecoder: NSCoder!) { 
     name = aDecoder.decodeObjectForKey("name") as String 
    } 

    override init() { 
    } 
} 

class ArchiveData:NSObject { 

    var documentDirectories:NSArray = [] 
    var documentDirectory:String = "" 
    var path:String = "" 

    func saveData(#nameData: Data) { 
     documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     documentDirectory = documentDirectories.objectAtIndex(0) as String 
     path = documentDirectory.stringByAppendingPathComponent("data.archive") 

     if NSKeyedArchiver.archiveRootObject(nameData, toFile: path) { 
      //println("Success writing to file!") 
     } else { 
      println("Unable to write to file!") 
     } 
    } 

    func retrieveData() -> NSObject { 
     var dataToRetrieve = Data() 
     documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
     documentDirectory = documentDirectories.objectAtIndex(0) as String 
     path = documentDirectory.stringByAppendingPathComponent("data.archive") 
     if let dataToRetrieve2 = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? Data { 
      dataToRetrieve = dataToRetrieve2 as Data 
     } 
     return(dataToRetrieve) 
    } 
} 
+0

고마워 이것이 내가 찾고있는 것입니다. – LearningGuy

관련 문제