Sunday 24 November 2013

Save and Retrieve Custom Object from NSUserDefaults


If you have a custom class and save the object of class in NSUserDefaults you have the use initWithCoder and encodeWithCoder.

Example class :-

TestClass.h

 #import <Foundation/Foundation.h>  
   
 @interface TestClass : NSObject{  
   NSString *strTest;  
   NSMutableDictionary *dictTest;  
   int test;  
 }  
 @property(nonatomic,retain)NSString *strTest;  
 @property(nonatomic,retain)NSMutableDictionary *dictTest;  
 @property(nonatomic,assign)int test;  
   
 @end  

TestClass.m

 #import "TestClass.h"  
   
 @implementation TestClass  
   
 @synthesize strTest,dictTest,test;  
   
 -(id)initWithCoder:(NSCoder *)coder{  
   self=[[TestClass alloc]init];  
   if (self!=nil) {  
     self.strTest=[coder decodeObjectForKey:@"strTest"];  
     self.dictTest=[coder decodeObjectForKey:@"dictTest"];  
     self.test=[coder decodeIntegerForKey:@"test"];  
   }  
   return self;  
 }  
   
 -(void)encodeWithCoder:(NSCoder *)coder{  
   [coder encodeObject:self.strTest forKey:@"strTest"];  
   [coder encodeObject:self.strTest forKey:@"dictTest"];  
   [coder encodeInt:self.test forKey:@"test"];  
 }  
   
 @end  


Save and retrieve this TestClass object from NSUserDefaults.

Save Object

//create object

 TestClass *objTest=[[TestClass alloc]init];  

//set data

 objTest.strTest=@"Testing";  
 objTest.test=10;  
 NSMutableDictionary *dict=[[NSMutableDictionary alloc]init];  
 [dict setObject:@"Testing" forKey:@"Test"];  
 objTest.dictTest=dict;  

//save object to NSUserDefaults

 NSData *data=[NSKeyedArchiver archivedDataWithRootObject:objTest];  
 NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];  
 [userDefaults setObject:data forKey:@"customObject"];  
 [userDefaults synchronize];  

Retrieve Object

 NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];  
 NSData *dataSavedForObject = [userDefaults objectForKey:@"customObject"];  
 TestClass *objTest=[NSKeyedUnarchiver unarchiveObjectWithData:dataSavedForObject];  

Now you get the object of TestClass.


Saturday 23 November 2013

Save and Retrieve data from NSUserDefaults

Saving

 NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];  

// set value

 [userDefaults setBool:YES forKey:@"keyForBOOL"];  
 [userDefaults setDouble:10.5454 forKey:@"keyForDouble"];  
 [userDefaults setFloat:10.5 forKey:@"keyForFloat"];  
 [userDefaults setInteger:10 forKey:@"keyForInteger"];  
 [userDefaults setURL:[NSURL URLWithString:@"http://nsuserdefaults-in-iphone-sdk.blogspot.in/"]forKey:@"keyForURL"];  
 [userDefaults setObject:@"Hello" forKey:@"keyForObject"];  

// saving to user default

 [userDefaults synchronize];  

Retrieving

 NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];  

// get value from user default

 BOOL isYou = [userDefaults boolForKey:@"keyForBOOL"];  
 double varDouble = [userDefaults doubleForKey:@"keyForDouble"];  
 float varFloat = [userDefaults floatForKey:@"keyForFloat"];  
 NSInteger varInt = [userDefaults integerForKey:@"keyForInteger"];  
 NSURL *url = [userDefaults URLForKey:@"keyForURL"];  
 NSString *str = [userDefaults objectForKey:@"keyForObject"];  

Date comparison

For date comparison compare method use from NSDate.h,
this method return NSComparisonResult.

Custom method for date comparison:

 -(BOOL)isBetweenDate:(NSDate *)yourDate startingDate:(NSDate *)startDate endingDate:(NSDate *)endDate  
 {  
   if ([yourDate compare:startDate] == NSOrderedAscending)  
     return NO;  
   if ([yourDate compare:endDate] == NSOrderedDescending)  
     return NO;  
   return YES;  
 }  

Using this code for compare date:

 if ([self isBetweenDate:yourDate startingDate:startDate endingDate:endDate])  
   {  
     NSLog(@"Your date is between start and end date");  
   }  
   else{  
     NSLog(@"Your date is not between start and end date");  
   }  

Date formatting

There are some key that use for date formatting in objective-c:

For Time:

a (AM, PM)

//For Hour

h (1, 2, …., 12)
hh (01, 02, …., 12)
H (1, 2, …., 23, 24)
HH (01, 02, …, 23, 24)

//For minute

m(0,1,2,….,58,59)
mm(00,01,02,…,58,59)

//For second

s(0,1,2,….,58,59)
ss(00,01,02,…,58,59)

For Date:

d (1, 2, 3, …., 12, ….., 30, 31)
dd (01, 02, 03, ….., 12, …, 30, 31)

For Day:

e (1 to 7 days)
EEE (Sun, Mon, Tue, Wed, Thu, Fri, Sat)
EEEE (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)

For Month:

M (1, 2, …, 12)
MM (01, 02, …, 12)
MMM (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
MMMM (January, February, March, April, May, June, July, August, September, October, November, December)

For Year:

yy (2 Digits year ex. 12)
YYYY (Full Year ex. 2012)

For Timezone:

z (for GMT Abbreviation of timezone)
zzzz (for GMT Name of timezone)

Methods for date to date formatting and conversion: 

//date to date

 -(NSDate *)convertDateToDate:(NSDate *) date  
 {  
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];  
    NSDate *newDate = [[[NSDate alloc] init] autorelease];  
    [formatter setDateFormat:@"yyyy-MM-d"];//use your format   
    NSString * strdate = [formatter stringFromDate:date];  
    newDate = [formatter dateFromString:strdate];  
    return newDate;  
 }  

this may return format of date like 2013-01-23

Request authorization to Address Book

This code use for accessing address book

 ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);  
 // Check address book permission is given or not   
  if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)  
 {  
      ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error)  
     {  
          //the address book permission is given  
          //do your code for address book  
     });  
 }  
  else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)  
 {  
          //if you have already permission for address book  
          //do your code for address book  
 }  
  else {  
     // The user has previously denied access  
     // Send an alert telling user to change privacy setting in settings app  
 }  

Request authorization to Calendars

This code use for calendars access

 if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])  
   {  
         [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)  
        {  
               if (granted)  
               {  
                    //the Calendars permission is given  
                   //do your code for Calendars  
               }  
               else{  
                    //the Calendars permission is not given  
               }  
         }];  
   }  

//For get permission for calendars, The user has previously denied access 

//iOS Settings > Privacy > Calendars > MY APP > ENABLE | DISABLE