2014-02-10 2 views
0

다음 설정 번들에서 선택한 옵션에 따라 plist를 읽고 글꼴 색상을 변경하려고합니다. enter image description hereNSDictionary App Crash

다음은 내가 그것을 달성하기 위해 노력하고 방법은 다음과 같습니다

NSString *path = @"/var/mobile/Library/Preferences/NCNotes.plist"; 
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
fontSize = [[dict objectForKey:@"slideSwitched"] floatValue]; 

if ([[dict objectForKey:@"noteColor"] valueForKey:@"Purple"]) { 
    noteView.textColor = [UIColor purpleColor]; 
} else { 
    noteView.textColor = [UIColor blackColor]; 
} 

내 응용 프로그램이 충돌하는 이유는 왜 어떤 아이디어? 선택한 값에 따라 값을 읽고 색상을 변경하려면 어떻게해야합니까?

+0

시도해보십시오. if ([[dict objectForKey : @ "noteColor"] isEqualTo : @ "Purple"]) – Merlevede

+0

이전에 질문했습니다. 그 대답은 "noteColor"라는 이름의 "키"가 없습니다. "noteColor"값을 갖는 "key"라는 이름의 "key"가 있습니다 ... " – Putz1103

답변

1

plist의 최상위 레벨은 배열이 아니며 사전이 아닙니다. 상단에는 모든 항목이 들어있는 "항목 1"이 표시되어 있기 때문입니다. 그래서 배열 안에 사전이 있습니다. 따라서 코드를 다음과 같이 바꿀 수 있습니다 :

NSString *path = @"/var/mobile/Library/Preferences/NCNotes.plist"; 
NSArray *array = [[NSArray alloc] initWithContentsOfFile:path]; 
NSDictionary *dict = array[0]; 

plist의 구조를 변경하여 사전 대신 배열을 사용할 수 있습니다.

또한 키는 왼쪽에 있고 그 값은 오른쪽에 있으므로 키 "noteColor"가 표시되지 않습니다. "noteColor"값을 갖는 키 "키"가 있으므로 수정해야합니다. "screenshot"의 범위 밖에있을지라도 "slideSwitched"키도 보지 않습니다.

은 또한 다음은 작동하지 않습니다 : 당신이 [dict objectForKey:@"noteColor"]에서 얻을 무엇이든

[[dict objectForKey:@"noteColor"] valueForKey:@"Purple"] 

은 사전 될 수 없습니다, 그래서에 valueForKey:를 호출하면 당신이 원하는 걸 줄 않을 것입니다.

+0

"키 "키를 가지고 있다는 것을 어떻게 알 수 있습니까? 값 "noteColor". 나는 그것이 객체 "noteColor"의 열쇠가 될 것이라고 생각했습니다. –

+0

어떤 값을 선택했는지 어떻게 결정해야합니까? –

+0

스크린 샷에 plist 파일의 키가 "key"이고 값이 "noteColor"인 항목이 명확하게 표시됩니다. 그게 내가 아는 방법이야. – Gavin

0

단순히

NSString *contentPath=[[NSBundle mainBundle] pathForResource:@"PLIST_FILE_NAME" ofType:@"plist"]; 
NSDictionary *dictionary=[NSDictionary dictionaryWithContentsOfFile:contentPath]; 

이 후 로직을 작성 문서 디렉토리에이 작업을 수행해야 잠깐, 그것은 또한 키 "noteColor"를 해달라고처럼 보인다. plist를 확인하십시오

+0

나는 내 plist와 함께 "noteColor"라는 키를 가질 것이라고 생각했습니다. 열쇠를 식별하는데 잘못된 것이 있습니까? –

+0

예, 문제가 무엇인지 발견했습니다. 사전이 아닌 배열로 plist의 루트를 선택해야합니다. 해당 배열은 9 개의 사전을가집니다. 그것을 확인하십시오 – Pawan

+0

한 가지 더, noteColor는 키가 아닙니다. 당신의 키 "키"에 대한 그 값. plist를 확인하십시오. 왼쪽 키, 오른쪽 값은 – Pawan

0

다음은 wazoo에서 문서화 된 몇 가지 예제 코드입니다. 다행히도이 plists 및 사전 작동 방식을 이해하는 데 도움이되기를 바랍니다. 모든 것은 당신의 plist 파일을 기반으로 할 것입니다. (확실히 개선 될 수 있지만, 당신의 구체적인 상황을 알지 못하는 한 당신에게 달려 있습니다.)

"사용자 선택에 따라 색상을 찾는 방법은 무엇입니까?" 사용자 선택을 int로 가정합니다. "User selected 7"과 같은 것입니다.

//Load your plist dictionary 
NSString *path = @"/var/mobile/Library/Preferences/NCNotes.plist"; 
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 

//Get the array of validValues and the array of validTitles 
NSArray *valuesArray = [dict objectForKey:@"validValues"]; 
NSArray *titlesArray = [dict objectForKey:@"validTitles"]; 

//Now get the user selected index from the validValues array 
int arraySelection = -1; 
for(int i = 0; i < [valuesArray count]; i++) 
{ 
    NSNumber *number = [valuesArray objectAtIndex:i]; 
    if([number intValue] == userSelectedInput) 
    { 
     arraySelection = i; 
     break; 
    } 
} 
if(arraySelection == -1) 
{ 
    //Not found in array 
    return; 
} 

//Now with that index get the title of the object that the user selected 
NSString *userSelectedTitle = [titlesArray objectAtIndex:arraySelection]; 

//Now do your checking on what the user selected based on that: 
if([userSelectedTitle isEqualToString:@"Purple"]) 

... 

당신은 이걸 꽤 많이 끓일 수 있습니다. 현재 validValues 어레이는 완전히 쓸모가 없습니다. 순서가 맞지 않거나 번호가 누락 된 경우에는 필요하지만, 유효 자막 배열을 사용하여 직선 계산을 할 수 있습니다.

+0

입니다. 그것은 userSelectedInput이 int 인 경우 해당 값을 변환 할 수 없다고 말합니다. –

+0

@AnthonyGeranio 내 대답이 업데이트되었습니다. 귀하의 valuesArray 문자열 대신 숫자입니다 것으로 나타났습니다. 하지만 여전히 단조로운 경우 값 배열을 제거 할 수 있다고 말합니다. – Putz1103

+0

여전히 작동하지 않는 것 같습니다. 어쩌면 내가 뭔가를 놓치고있다하지만 배열에서 아무것도 찾을 때 내보기 전적으로로드하지 않는 것 같다. –