2011-06-07 72 views
0

我想知道如何保存我的iOS應用程序陣列。我使用了一種方法,但它只保存在我的iPod Touch上。我曾在iPad上測試過,但沒有奏效。保存iOS應用程序陣列

我需要的是一個代碼保存在任何設備上我的應用程序陣列...

任何人都可以幫我嗎?

下面是代碼:

myAppViewController.h:

- (NSString *)GetApplicationDocumentsDirectory; 
- (void)applicationWillTerminate:(NSNotification *)notification; 

myAppViewController.m:

-(NSString*) GetApplicationDocumentsDirectory { 
    static NSString* documentsDirectory = nil; 
    if (documentsDirectory == nil) { 
     documentsDirectory = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                    NSUserDomainMask, 
                    YES) 
           objectAtIndex:0] retain]; 

    } 
    NSString *fullFileName = [NSString stringWithFormat:@"%@/TarefasSalvas.plist", documentsDirectory]; 
    return fullFileName; 
} 

- (void)applicationWillTerminate:(NSNotification *)notification{ 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
          [array addObject:lisTitulos]; 
          [array addObject:lisImagens]; 
          [array addObject:lisData]; 
          [array addObject:lisDetalhes]; 

    [array writeToFile:[self GetApplicationDocumentsDirectory] atomically:YES]; 
} 


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSString *filePath = [self GetApplicationDocumentsDirectory]; 
    //if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { 
     NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 
    if (array != nil){ 
     lisTitulos = [array objectAtIndex:0]; 
     lisImagens = [array objectAtIndex:1]; 
     lisData = [array objectAtIndex:2]; 
     lisDetalhes = [array objectAtIndex:3]; 
    } 
    else { 
     NSDate *date = [NSDate date]; 
     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
     [dateFormat setLocale:[NSLocale currentLocale]]; 
     [dateFormat setDateFormat:@"dd/MM/YYYY"]; 
     NSString *dateNow = [dateFormat stringFromDate:date]; 

     lisTitulos = [[NSMutableArray alloc] initWithObjects:@"Titulo",nil]; 
     lisImagens = [[NSMutableArray alloc] initWithObjects:@"0.png",nil]; 
     lisData = [[NSMutableArray alloc] initWithObjects:dateNow,nil]; 
     lisDetalhes = [[NSMutableArray alloc] initWithObjects:@"",nil]; 
    } 

    UIApplication *app = [UIApplication sharedApplication]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app]; 
} 

感謝

+0

你能告訴我們到底爲止你已經用一些代碼和例子完成了什麼嗎? – Luke 2011-06-07 19:12:14

+0

你的代碼是什麼? – 2011-06-07 19:12:24

+0

好的,我將編輯.. – VnE 2011-06-07 19:13:32

回答

0

這是可能的,你只是發送應用程序的背景,而不是終止它們。在這種情況下,applicationWillTerminate:將不會被調用。這似乎是可能的原因,因爲其餘代碼看起來不錯。

而你的GetApplicationDocumentsDirectory似乎有點奇怪的命名,因爲它獲取存儲數組的文件的路徑。除此之外,

NSString *fullFileName = [NSString stringWithFormat:@"%@/TarefasSalvas.plist", documentsDirectory]; 

不是獲取文件路徑的正確方法。您應該documentsDirectory這樣使用stringByAppendingPathComponent:方法,

NSString *fullFileName = [documentsDirectory stringByAppendingPathComponent:@"TarefasSalvas.plist"]; 

這也將是有意義的聲明fullFileName爲靜態變量,而不是documentsDirectory

+0

感謝您的回覆,但不幸的是,它仍然沒有保存在ipad =/ – VnE 2011-06-07 19:37:54

+0

你確定該方法正在調用? 'writeToFile:atomically:'方法在失敗時返回'NO'。你應該檢查它返回的結果。 – 2011-06-07 19:45:32

+0

嗯,我注意到當我在iPad上運行我的應用程序時,當我關閉應用程序時,在Xcode屏幕的底部顯示:'GDB:數據格式化程序臨時不可用,將在「繼續」之後重新嘗試。在這個時候打電話給dlopen。)' – VnE 2011-06-07 20:00:28

0

謝謝@Deepak。 當你告訴我有關在調試中使用日誌警報的提示之後,我注意到iPad正在終止應用程序,然後應用程序無法調用前面提到的applicationWillTerminate:方法。 所以,我解決了這個問題改變了我的代碼:

- (void)applicationWillTerminate:(NSNotification *)notification{ 
    [self SavingStatus]; 
} 

-(void)SavingStatus { 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    [array addObject:lisTitulos]; 
    [array addObject:lisImagens]; 
    [array addObject:lisData]; 
    [array addObject:lisDetalhes]; 

    [array writeToFile:[self GetApplicationDocumentsDirectory] atomically:YES]; 
} 

正如你所看到的,我創建了我呼籲applicationWillTerminate:方法,每次應用程序重新加載表數據的方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    ... 

    [self SavingStatus]; 

    return cell; 

} 

通過這樣,即使您的設備在關閉之前關閉了應用程序,信息仍然會保存= D。

再次感謝@Deepak 和所有回覆我的人。