2015年6月9日 星期二

[iOS] 如何儲存使用者設定?(NSUserDefaults) / 類似Android的SharedPreferences

相信大家寫的app如果有登入之類的東西一定會遇到一個問題,就是儲存使用者設定!

不然每次叫使用者重新輸入應該會崩潰吧?!


--------------------------------------------------------------------------------------------------------------------------


正文開始:

Step1:

先到.h檔 (看是appdelegate.h or ViewController.h)

宣告一個NSUserDefaults屬性的變數

//
//  AppDelegate.h
//
//  Created by daniel on 2015/4/29.
//  Copyright (c) 2015 daniel. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "AsyncUdpSocket.h"
#define global ((AppDelegate *)[[UIApplication sharedApplication] delegate])

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    NSUserDefaults *userDefaults;

}

這樣我們就可以在.m file內使用該變數(userDefaults)



Step2:

在.m file內的viewdidload()這裡面(反正就是第一個讀到的地方)

先初始化我們的userDefaults,這一部很重要!!沒有初始化會叫不出儲存的東西!!

初始化:userDefaults = [NSUserDefaults standardUserDefaults];

接下來就是儲存/讀取

儲存:

    NSString *string = @"192.168.0.1";
    [userDefaults setObject:string forKey:@"store IP"];

    NSArray *array = @[@"123",@"456"];
    [userDefaults setObject:array forKey:@"Array"];

    BOOL isValid = YES;
    [userDefaults setBool: isValid forKey:@"isValid"];

    int number = 100;
    [userDefaults setInteger:number forKey:@"number"];

可以看到上述四種不同的類型(nsstring,nsarray,BOOL,int)

大致上都是一樣的,差別只是在於setXXX(類型)

格式:(儲存)

[NSUserDefaults型態變數  setObject(或其他型態): 變數名稱 forKey: @"隨意取key 名稱"]

格式:(讀取)

[NSUserDefaults型態變數 stringforKey: @"隨意取key 名稱"]

(或是valueforKey:)

範例:NSString *store_ip = [userDefaults stringForKey:@"store IP"];


*****非常重要*****

在儲存完畢以後,要記得!!

[NSUserDefaults型態變數 synchronize];

如果沒有這行,就不會真正儲存到硬碟裡面!

完成以後,就可以透過這樣的方式來儲存使用者設定了:)

END


2015年6月4日 星期四

[iOS] NSData NSMutableData append / NSString to Char 等問題解法

不是我要說iOS,轉來轉去每個都好麻煩0rz

好吧!

首先,這邊目標是:結合NSString + char[] ,最後變成NSData輸出

NSString *myString = @"123abcdfhhhhhhh";
char *aa = [myString UTF8String];

NSLog(@"%s",aa);
NSLog(@"%lu",sizeof(aa));

NSLog(@"%lu",(unsigned long)[myString length]);

這邊設定一個string ,然後讓他轉utf8格式放到char指標裡面


nslog會顯示

2015-06-04 15:55:32.897 v1.0[4462:60b] 123abcdfhhhhhhh
2015-06-04 15:55:32.898 v1.0[4462:60b] 4

2015-06-04 15:55:32.900 v1.0[4462:60b] 15

所以要特別注意sizeof()並不是mystring分開後的個數,而是4byte 

因為這個錯誤搞了半天0rz.....

到這邊已經很順利的把nsstring 改為char了,但是要怎樣把這兩樣結合呢?


    const unsigned char two[]    = {80 ,67 ,77 ,83 , 2 ,2};//第二個char[]
    
    NSMutableData * muData = [[NSMutableData alloc] init];//用來結合的容器
    
    NSMutableData * data = [NSData dataWithBytes:two length:sizeof(two)];
    NSMutableData * data2 = [NSData dataWithBytes:aa length:[myString length]];//這邊要用length


------------------結合--------------------

   [muData appendData:data];
   [muData appendData:data2];

------------------結合--------------------

    NSString *strData = [[NSString alloc]initWithData:muData encoding:NSUTF8StringEncoding];
   
    NSLog(@"%@",strData);

最後輸出成NSString 方便nslog看成果為如何?


2015-06-04 15:55:43.650 v1.0[4462:60b] PCMS123abcdfhhhhhhh


最後使用


NSData *aData = [strData dataUsingEncoding: NSASCIIStringEncoding];

轉為NSData~


完成!

end