Save String to the Nsuserdefaults

Save string to the NSUserDefaults?

NSString *valueToSave = @"someValue";
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"preferenceName"];
[[NSUserDefaults standardUserDefaults] synchronize];

to get it back later

NSString *savedValue = [[NSUserDefaults standardUserDefaults]
stringForKey:@"preferenceName"];

Store [String] in NSUserDefaults

The following code should help you resolve your problem:

import UIKit

class ViewController: UIViewController {

var food: [String] {
get {
if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
return returnValue
} else {
return ["muesli", "banana"] //Default value
}
}
set {
NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
NSUserDefaults.standardUserDefaults().synchronize()
}
}

override func viewDidLoad() {
super.viewDidLoad()

print(food) // prints: ["muesli", "banana"] (at first launch)

food = ["cake"]
print(food) // prints: ["cake"]

food += ["spaghetti"]
print(food) // prints: ["cake", "spaghetti"]

food = []
print(food) // prints: []

NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
print(food) // prints: ["muesli", "banana"]
}

}

However, with the previous code, if you set food = [], you will have a problem as food won't return ["muesli", "banana"]. In order to avoid this, you may prefer the following code:

import UIKit

class ViewController: UIViewController {

var food: [String] {
get {
if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
return returnValue == [] ? ["muesli", "banana"] : returnValue
} else {
return ["muesli", "banana"] //Default value
}
}
set {
NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
NSUserDefaults.standardUserDefaults().synchronize()
}
}

override func viewDidLoad() {
super.viewDidLoad()

print(food) // prints: ["muesli", "banana"] (at first launch)

food = ["cake"]
print(food) // prints: ["cake"]

food += ["spaghetti"]
print(food) // prints: ["cake", "spaghetti"]

food = []
print(food) // prints: ["muesli", "banana"]

NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
print(food) // prints: ["muesli", "banana"]
}

}

Objective C - Saving a variable inside NSUserDefaults

You have missed sync call.Apply this to save it.

if (button.selected)
{
[button setSelected:YES];
[[NSUserDefaults standardUserDefaults]setObject:[NSNumber numberWithBool:YES] forKey:@"buttonSelected"];
[[NSUserDefaults standardUserDefaults] synchronize];

}

to get it back later

NSNumber* savedValue = [[NSUserDefaults standardUserDefaults]
objectForKey:@"buttonSelected"];

This is if you want to store only the value.
If you want to store your custom object look at this link
How to store custom objects in NSUserDefaults

UserDefaults save String - Attempt to set a non-property-list object (Function) as an NSUserDefaults/CFPreferences

toReadableString() is an instance method, you have to call it on timeResponse rather than on the type which returns the function the compiler is complaining about by the way.

let jsonTransferTime = timeResponse.toReadableString()

Please conform to the naming convention that variable names start with a lowercase letter and don't annotate types the compiler can infer.

Save & Format String using NSUserDefaults

Solution found.
Save the new text for example here

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

let data = NSKeyedArchiver.archivedDataWithRootObject(textView.attributedText)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "sawedString")

textView.resignFirstResponder()
}

Upload saved text when opening

override func viewDidLoad() {

super.viewDidLoad()

if let myStringData = NSUserDefaults.standardUserDefaults().objectForKey("sawedString") as? NSData {
let savedString = NSKeyedUnarchiver.unarchiveObjectWithData(myStringData) as? NSAttributedString
textView.attributedText = savedString

}

}

Use the NSAttributedString instead of the NSMutableAttributedString!

Converting [NSURL] into [String] for NSUserDefaults?

Using NSData

You can convert each NSURL to NSData in order to save it

func save(urls: [NSURL]) {
let urlsData = urls.map { $0.dataRepresentation }
NSUserDefaults.standardUserDefaults().setObject(urlsData, forKey: "urlsData")
}

Later on you can retrieve the NSData array and convert it back to [NSURL]

func load() -> [NSURL]? {
let retrievedData = NSUserDefaults.standardUserDefaults().arrayForKey("urlsData") as? [NSData]
return retrievedData?.map { NSURL(dataRepresentation: $0, relativeToURL: nil) }
}

Using String

Alternatively you can save the urls as String(s)

func save(urls: [NSURL]) {
let urlsData = urls.map { $0.absoluteString }
NSUserDefaults.standardUserDefaults().setObject(urlsData, forKey: "urlsData")
}

func load() -> [NSURL?]? {
let retrievedData = NSUserDefaults.standardUserDefaults().arrayForKey("urlsData") as? [String]
return retrievedData?.map { NSURL(string: $0) }
}

As discussed in the comments below, if data is written to NSUserDefaults exclusively with the save function, we know that every element of the array is a String representing a valid NSURL.

So we can change the return type of load from [NSURL?]? to [NSURL]? using this alternate version of load.

func load() -> [NSURL]? {
let retrievedData = NSUserDefaults.standardUserDefaults().arrayForKey("urlsData") as? [String]
return retrievedData?.flatMap { NSURL(string: $0) }
}

How to save any class in NSUserDefaults

To store custom classes in NSUserDefaults, the data type needs to be a subclass of NSObject and should adhere to NSCoding protocol.

1) Create a custom class for your data

class CustomData: NSObject, NSCoding {
let name : String
let url : String
let desc : String

init(tuple : (String,String,String)){
self.name = tuple.0
self.url = tuple.1
self.desc = tuple.2
}
func getName() -> String {
return name
}
func getURL() -> String{
return url
}
func getDescription() -> String {
return desc
}
func getTuple() -> (String,String,String) {
return (self.name,self.url,self.desc)
}

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

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

2) To save data use following function:

func saveData()
{
let data = NSKeyedArchiver.archivedDataWithRootObject(custom)
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(data, forKey:"customArray" )
}

3) To retrieve:

if let data = NSUserDefaults().dataForKey("customArray"),
custom = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [CustomData] {
// Do something with retrieved data
for item in custom {
print(item)
}
}

Note: Here I am saving and retrieving an array of trhe custom class objects.



Related Topics



Leave a reply



Submit