[iOS Study] NSUserDefaults |
출처 : 아론 힐리가스의 iOS 프로그래밍
-
사용자의 환경설정(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 |
댓글