2011-05-14 8 views
0

즐겨 찾기에 추가 기능이 제대로 작동하지 않습니다. "appDidFinishLaunching"의 애플 대리자에서즐겨 찾기에 추가 기능성

, : 가 여기에 내가 설정에 즐겨 찾기 데이터의 배열 및 사전을 사용하고 코드 내 detailViewController에서 다음

delegateFavouritesDictionary = [NSMutableDictionary dictionary]; 

NSLog(@"Mutable Dictionary: %@", delegateFavouritesDictionary); 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"]; 

[delegateFavouritesDictionary writeToFile:filePath atomically: YES]; 

delegateFavouritesArray = [[NSMutableArray alloc] init]; 

, 나는이 addToFavourites가 기능 :

if([[addToFavouritesDictionary allKeys] containsObject:ID]) { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"]; 

    [addToFavouritesDictionary removeObjectForKey:ID]; 
    [addToFavouritesArray removeObject:Name]; 
    [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal]; 
    [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
    NSLog(@"New Dictionary: %@", addToFavouritesDictionary); 

} else { 

    [addToFavouritesArray addObject:Name]; 
    NSString *ID = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID"]; 
    [addToFavouritesDictionary setObject:Name forKey:ID]; 
    [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"]; 

    [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
    NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary); 
    //[addToFavouritesDictionary release]; 
} 

위의 코드는 응용 프로그램의 실행에서 예상대로 작동, 그것은 사전에 "Saved.data"의 사전로드 내용을 설정 한 후 detailViewController에, 그것은 "저장을로드합니다. 데이터 "파일을 추가하고 de 그 파일에 letes. 내가 겪고있는 문제는 iPhone이 다시 시작되거나 즐겨 찾기 데이터가 모두 사라 졌거나 앱이 충돌하여 다시 열리면 즐겨 찾기에있는 모든 데이터가 사라졌습니다. 기기가 다시 시작되거나 전원이 꺼질 때마다 삭제되지 않고 저장된 데이터를 유지할 수있는 방법이 있습니까?

미리 감사드립니다.

+0

어디서나 파일을 읽지 못하거나 질문에 오자가 있거나 실제로 saved.data 파일을 읽지 않습니까?detailViewController의 –

+0

에서 viewDidLoad 메서드에서 addToFavouritesDictionary를 시작합니다. 해당 코드를 추가하는 것을 잊었습니다. –

+0

그래, 내 대답을 참조하십시오, 나는 당신이 단지 다시 시작할 때마다 귀하의 데이터를 덮어 쓰고 있다고 가정합니다. 어쨌든 내 iPhone이 꺼져있어 내 데이터가 문서 폴더에서 사라지지 않으므로 데이터를 삭제해야하는 이유가 없습니다. –

답변

0

왜 사용자 환경 설정에 저장하지 않으시겠습니까? 당신은 당신이 읽는다면 당신은 지금, 새 사전을 생성하고 saved.data에 저장하는 appDidFinishLaunching에, 때마다 앱이 시작 당신에게 즐겨 찾기를 덮어 쓰는 것처럼

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
[prefs setObject:yourobject forKey:@"yourkey"]; 

또는 SQLite는의 은 ...

+0

감사합니다. 그렇게 해 드리겠습니다. 사용자 환경 설정에 사전을 저장 한 다음 detailViewController에로드하는 것이 좋습니다. –

+0

네, 제가 생각하기에 가장 쉬운 방법입니다. 또는 즐겨 찾기가 많다면 SQLite를 사용하십시오. – Roki

+0

그래, 일반적으로 최종 사용자는 최대 15 ~ 20 개의 즐겨 찾기 만 가질 수 있으므로 그 이상인 사용자는 볼 수 없습니다. –

0

보인다 detailViewController에서 새로운 빈 사전을 얻을 수 있습니다.

이렇게하면 iPhone을 다시 시작할 때 데이터를 사용하는 이유가 설명됩니다. 이는 전원을 껐다가 다시 켜기 때문에 Documents 디렉토리에 저장된 파일이 제거되지 않기 때문입니다. 이 디렉토리는 데이터를 저장하고 재시작 사이에 안전하게 보관할 수 있도록하기위한 디렉토리입니다. 그렇지 않으면 의미가 없으므로 "tmp"라고해야합니다.

편집

제안 : (applicationDidEnterBackground :와 및/또는 applicationWillTerminate - 전자를 멀티 태스킹 지원하고, 그렇지 않으면 후자의 경우) 각 변경에 저장하거나 동안 응용 프로그램을 떠나, appDidFinishLoading에 한 번만로드하고 괜찮을거야. 다음

[NSKeyedArchiver archiveRootObject: d toFile: filePath]; 

복원 :

NSMutableDictionary *d = [NSKeyedUnarchiver unarchiveObjectWithFile: filePath]; 
if (d == nil) { 
    d = [[NSMutableDictionary alloc] init]; 
} 

당신이 시도 할 수 있습니다 :

편집

내가하는 일은 NSKeyedArchiver와 NSKeyedUnarchiver을 사용하기 때문에 데이터를 저장하는 것입니다 + (id)dictionaryWithContentsOfFile:(NSString *)path 파일에서 사전을 가져 오는 NSDictionary 클래스의 이름입니다.

delegateFavouritesDictionary = [NSMutableDictionary dictionaryWithContentsOfFile: filePath]; 
if (delegateFavouritesDictionary == nil) { 
    delegateFavouritesDictionary = [[NSMutableDictionary alloc] init]; 
} 

파일이 존재하는지 확인하지 않아도됩니다. 오류가 발생하면 nil을 얻게되고,이 경우 빈 인스턴스를 생성하게됩니다.

+0

좋아요, appDidFinishLaunching에서 파일이 먼저 존재하는지 확인해야하며, 존재하지 않으면 파일을 생성하고, 존재한다면 그냥로드해야합니까? –

+0

파일에서로드되지 않은 경우에만 delegateFavouritesDictionary가 (! delegateFavouritesDictionary를 사용하여) 확인되는 경우에만 수행해야합니다. 이제는 명시 적으로 nil과 대조하여 확인한 경우 대답을 편집 한 것이 더 명확 할 것이라고 생각합니다. –

+0

그래서 처음에는로드하려고합니다. 제대로 작동한다면 이전 즐겨 찾기를 준비 할 준비가되었습니다. 그렇지 않으면 응용 프로그램에서 채울 준비가 된 빈 사전을 만듭니다. 이제 응용 프로그램을 종료 할 때와 같이 적절한 시간에 다음 시작시에로드 할 수 있도록 저장해야합니다. –

관련 문제