2013-12-16 43 views
0

新的編碼和嘗試爲我的iOS程序的一部分創建一個簡單的檢查列表(如購物清單)。在運行模擬器之前,選擇單元格會更改附件圖標ok並手動更改字典中的BOOL值,這樣也會改變acc的圖標。所以這個問題似乎與選擇單元格後更改plist中的BOOL值的代碼有關。任何幫助將大量讚賞。正如我剛纔所說的那樣,對於任何劣質代碼或明顯錯誤都表示歉意。Xcode 5 iPhone屬性列表不更新

* CODE編輯,以便不再閱讀和寫作列表從主束

#import "CheckListViewController.h" 
#import "ListItem.h" 

@interface CheckListViewController() 

@end 

@implementation CheckListViewController 


{ 
    NSMutableArray *eventList; 
} 


@synthesize tableView = _tableView; 


- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString* dataPath = [documentsDirectory stringByAppendingPathComponent:@"CheckList.plist"]; 

    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) { 
     NSString* resourceaPath = [[NSBundle mainBundle] pathForResource:@"CheckList" ofType:@"plist"]; 
     [[NSFileManager defaultManager] copyItemAtPath:resourceaPath toPath:dataPath error:NULL]; 
    } 

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"CheckList.plist"]; 
    NSMutableDictionary* dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 

    ListItem *listItem1 = [ListItem new]; 
    listItem1.itemName = @"Read Guide"; 
    listItem1.itemSelected = [dict valueForKey:@"Read Guide"]; 

..... 
    eventList = [NSMutableArray arrayWithObjects:listItem1, listItem2, listItem3, listItem4, listItem5, listItem6, listItem7, listItem8, nil]; 

    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];  
} 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

    //Return the number of rows in the section. 
    return eventList.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    ListItem *listItem = [eventList objectAtIndex:indexPath.row]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 

     if (listItem.itemSelected == [NSNumber numberWithBool:YES]) { 
      (cell.accessoryType = UITableViewCellAccessoryCheckmark); 
     } else { 
      (cell.accessoryType = UITableViewCellAccessoryNone); 
     } 
    } 

    cell.textLabel.text = listItem.itemName; 

    return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO]; 

    ListItem *listItem = [eventList objectAtIndex:indexPath.row]; 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"CheckList.plist"]; 
    NSMutableDictionary* dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

    if (cell.accessoryType == UITableViewCellAccessoryNone) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 

     // Reflect selection in data model 
     [dict setObject:[NSNumber numberWithBool:YES] forKey:listItem.itemSelected]; 
     [dict writeToFile:path atomically:YES]; 


    } else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { 
     cell.accessoryType = UITableViewCellAccessoryNone; 

     // Reflect deselection in data model 
     [dict setObject:[NSNumber numberWithBool:NO] forKey:listItem.itemSelected]; 
     [dict writeToFile:path atomically:YES]; 
    } 

} 

@end 

對不起,我的代碼龐大塊,但認爲它的任何可能會出現問題。

回答

1

它看起來像你保存和加載的路徑是不同的。您正在從束路徑加載,然後使用writeToFile:atomically保存到相對路徑。如果我的猜測是正確的,那麼該方法的默認路徑不會返回到捆綁包中,而是應用程序的文檔目錄。在iOS上,您不能回寫主包,因此很有可能文件未被保存在您認爲的位置。

+0

沒錯。問題是它從bundle中加載plist文件並保存到錯誤的路徑中。如果該文件不存在,應將其更改爲將plist文件從捆綁包複製到/ Documents文件夾。 – Joey

+0

這是有道理的,非常感謝幫助的人會找到如何將它保存到正確的位置並相應地更新。再次感謝您的快速幫助 – user3105611