본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] NSUserDefaults

by 돼지왕 왕돼지 2016. 3. 27.
반응형


 [iOS Study] NSUserDefaults


출처 : 아론 힐리가스의 iOS 프로그래밍


+initialize, bool, child pane, const, convinience method, default, defaultValue, dictionaryRepresentation, Double, en.lporj, en.lproj, Extern, float, header, identifier, initialize, integerForKey, ios study, ios tutorial, Key, key-value pair, localize, notification, NSArray, NSData, NSDate, NSDictionary, NSGlobalDomain, NSNumber, NSRegistrationDomain, NSString, NSURL, NSUserDefaults, NSUserDefaultsDidChangeNotification, objectForKey:, Objective-C, Observer, plist, plist type, plist 타입, preference, PSChildPaneSpecifier, PSGroupSpecifier, PSMultiValueSpecifier, PSRadioGroupSpecifier, PSSliderSpecifier, PSTextFieldSpecifier, PSTitleValueSpecifier, PSToggleSwitchSpecifier, registerDefaults, removeObjectForKey:, Resources, Root.plist, setObject:forKey:, Setting.bundle, Settings Application SchemaReference, settings bundle, standardUserDefaults, Title, type, [iOS Study] NSUserDefaults, 객체, 검색, 공장 기본 설정, 공장 초기 설정, 그룹, 디렉터리, 딕셔너리, 딕셔너리 배열, 라디오, 라벨, 런타임, 번들 도메인, 뷰, 사용자 환경설정, 설정 번들, 설정 앱, 슬라이더, 아카이빙, 앱 번들, 우선 순위, 자동 호출, 자식 패널, 전역 설정, 전역변수, 제목, 첫 인스턴스, 컨비니언스 메소드, 컨트롤, 클래스, 클래스 메소드, 키, 키-값 쌍, 테이블뷰, 텍스트 필드, 토글, 파일 시스템, 환경설정


-

사용자의 환경설정(preferences) 을 가진 plist 가 각 앱 번들 안에 저장된다.

개발자는 NSUserDefaults 클래스를 사용하여 이 plist 에 접근할 수 있다.

또한 앱의 환경설정 plist 는 설정 앱에서 수정할 수 있다.

이를 허용하려면 앱 안에 설정 번들(settings bundle)을 만들어야 한다.



-

사용자의 기본 설정(default) 집합은 키-값 쌍의 모음이다.

키는 기본 설정의 이름이고 값은 키에 해당하는 사용자가 선호하는 것을 나타내는 데이터이다.

공유 사용자 기본값 객체에 그 키의 값을 요청한다.

이것은 딕셔너리에서 객체를 가져오는 것과 다르지 않다.


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSString *greeting = [defaults objectForKey:@“FavoriteGreeting”];


사용자가 선호하는 것을 나타내려면 해당 키에 값을 설정할 수 있다.


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:@“Hello” forKey:@“FovoriteGreeting”];


이 값은 자동으로 앱의 환경설정 plist 에 저장된다.



-

값은 반드시 plist 타입(NSArray, NSDictionary, NSString, NSData, NSDate, NSNumber )  이어야 한다.

plist 타입이 아닌 데이터를 사용자 기본 설정에 저장하려면 그것을 plist 로 변환해야 한다.

이것은 대개 객체를 NSData 에 아카이빙하여 완수할 수 있다.



-

사용자가 설정하지 않은 환경설정 값을 요청하면 NSUserDefaults 는 기본중의 기본인 공장 초기 설정을 반환한다.

이것은 파일 시스템에 저장되지 않는다.

앱을 실행할 때마다 공장 초기 설정을 NSUserDefaults 의 공유 인스턴스에 알려야 한다.

그리고 이것은 클래스가 기본 설정을 읽기 전인 실행 과정 초반에 해야 한다.

일반적으로 앱델리게이트에서 +initialize 메소드를 재정의한다.


+ (void)initialize{

     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

     NSDictionary *factorySettings = @{@“FavoriteGreeting”:@“Hey!”,

                                                            @“HoursBetweenMothershipConnection:@2};

     [defaults registerDefaults:factorySettings];

}


initialize 클래스 메소드는 클래스의 첫 인스턴스가 만들어지기 전에 Objective-C 런타임에 의해 자동으로 호출된다.



-

환경설정 키를 전역변수로 선언하는 것이 좋다.

header 파일에 전역변수를 선언한다.


extern NSString * const PrefKeyName;


그리고 implement 파일에 전역변수를 정의한다.


NSString * const PrefKeyName = @“PrefKeyName”;



-

다음을 통해 NSUserDefaults 에 들어있는 값 모두를 읽을 수 있다.


[defaults dictionaryRepresentation];



-

NSUserDefaults 에 대해 integerForKey 와 같은 메소드가 있는데 이것들을 컨비니언스 메소드라고 부른다.

float, double, BOOL, NSURL 값을 설정하고 가져오는 컨비니언스 메소드들도 있다.






-

장치 전체에 전역적인 설정이 저장되는 NSGlobalDomain

공장 기본 설정은 NSRegistrationDomain.

그리고 환경설정 plist 는 번들 도메인에 값이 존재한다. (  com.test.AppName )


각 도메인은 키-값 쌍의 딕셔너리이며,

NSUserDefaults 는 각 딕셔너리에 다른 우선순위를 준다.

예를 들어 번들 도메인은 NSRegistrationDomain 보다 우선권을 얻는다.



-

NSUserDefaults 는 앱의 환경설정 plist 에서 키-값 쌍을 제거하기 위해 removeObjectForKey: 메소드를 가진다.



-

“설정 번들” 은 plist 를 가진 디렉터리이다.

앱 안에 설정 번들을 만들려면 [New File] -> [Resources 패널] -> [Settings Bundle] 을 선택한다.

Setting.bundle 이라는 디렉토리가 프로젝트 디렉토리에 생겼을 것이다.

이 디렉토리는 Root.plist 파일과 en.lproj 하위 디렉토리를 갖는다.



-

Root.plist 는 사용자의 설정 패널에 나타낼 컨트롤들을 기술한다.

이것은 딕셔너리의 배열을 가진다.

각 딕셔너리는 패널에 표시할 뷰 하나(보통 컨트롤)을 나타낸다.

모든 딕셔너리는 반드시 Type 키를 가진다.

가능한 Type 값은 아래와 같다.


PSTextFieldSpecifier     라벨 있는 텍스트 필드

PSToggleSwitchSpecifier     라벨 있는 토글 스위치

PSSliderSpecifier     라벨 없는 슬라이더

PSRadioGroupSpecifier     라디오 버튼 리스트, 오직 한 값만 선택 가능하다.

PSMultiValueSpecifier     테이블뷰, 오직 한 값만 선택 가능하다.

PSTitleValueSpecifier     제목 구성

PSGroupSpecifier     그룹 구성

PSChildPaneSpecifier     일부 환경설정을 자식 패널로 옮긴다.



-

설정(settings)앱에서 해당 앱의 이름을 확인하면 Root.plist 에서 설정한 세팅을 볼 수 있다.



-

plist 에서 Identifier 는 기본값의 키

DefaultValue 는 키에 대한 value 가 없을 때 세팅되는 값

Title 은 string 파일에서 제목을 검색할 때 사용한다.



-

자신의 여러 앱들 중 하나의 설정 번들을 만들려면 애플의 [Settings Application SchemaReference] 를 참조해야 한다.

이 plist 에서 작동하는 모든 키/값의 완전한 목록을 볼 수 있다.



-

설정 번들 안에는 영어 문자열을 가진 en.lproj 가 있다.

키-값 쌍을 통해 텍스트 필드에 제목을 줄 수 있다.


“NextItemName” = “Translated Name”;



-

기본 설정이 바뀌면 (해당 앱이나 설정 앱을 통해) NSUserDefaultsDidChangeNotification 이 앱에 전해질 것이다.

설정 앱에서 변경에 대해 즉시 대응하려면 이 노티피케이션의 옵저버로 등록한다.






반응형

'프로그래밍 놀이터 > iOS' 카테고리의 다른 글

[iOS] 연락처 선택 modal 띄우기  (0) 2017.06.16
[iOS] keyboard type 바꾸기  (0) 2016.09.19
[iOS Study] 상태 복원  (0) 2016.03.26
[iOS Study] 코어 데이터  (0) 2016.03.25
[iOS Study] 지역화  (0) 2016.03.17

댓글