0

背景

我有 2 个表视图,第一个是主表,第二个是收藏夹表。

一切都用 plist 处理。

从第一个表的 detailView 中,我在右上角设置了一个按钮,将值 YES 写入 plist。

plist 的结构是这样的:

Section 1                  Dictionary
      Title                String
      Rows                 Array 
        Item 0             Dictionary
           name            String
           description     String
           image           String
           isFav           Bool (default NO)
      Item 1               Dictionary
           name            String
           description     String
           image           String
           isFav           Bool (default NO)

Section 2
      Title
      Rows
        Item 0             Dictionary
           name            String
           description     String
           image           String
           isFav           Bool (default NO)
        etc..

添加一个关于它应该如何工作的小计划:

firstTable          detailView                          plist
 __________          ________                   
|          |        |     |★ |<- button pressed ---> cellname isFav = YES      
|__________|        |        |               
|cellname  | ------>| detail |    
|__________|        |        |               
|          |        |        |               
|          |        |        |                

问题

现在我有了那个按钮,我正在尝试编写一个方法来将 isFav 布尔值写入 plist。

-(void)makeFavorite

我已经有了读取 plist 的方法,但我不知道如何在上面写一个值。我试图在谷歌上搜索并阅读其他 stackOverflow 帖子,但我无法弄清楚。任何帮助表示赞赏!

编辑

这是阅读plist的方法

- (NSArray*)readPlist 
{ 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *plistPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"tipsList.plist"]; 

    NSFileManager *fMgr = [NSFileManager defaultManager]; 
    if (![fMgr fileExistsAtPath:plistPath]) { 
        plistPath = [[NSBundle mainBundle] pathForResource:@"tipsList" ofType:@"plist"]; 

    } 
    return [NSArray dictionaryWithContentsOfFile:plistPath];
}

在我输入的方法中:

- (void) makeFavorite:(id)sender
 {   
     NSArray *test = [self readPlist];
     NSLog (@"test: %@",test);
    //write plist instructions then
 }
4

4 回答 4

3

您是否在寻找:

[myDictionary setObject:[NSNumber numberWithBool:NO] forKey:@"isFav"]
于 2012-06-17T09:25:49.493 回答
2

一个大纲,没有一个步骤特别涉及:

首先,如果您打算更改它,则需要一个可变字典。如果您将其称为(显然) ,则读取一个 plistditionaryWithContentsOfFile:会产生一个不可变的。NSDictionary

如果您在NSMutableDictionary文档中调用相同的方法,则表明字典本身是可变的,但它包含的对象不是。在您的情况下,您希望更改嵌入在数组中的字典中的单个值,该字典本身嵌入在字典中(至少) - 即您需要可变对象。

还有其他方法可以在 plist 中读取,这些方法可以让您指定需要可变对象,从读取和写入属性列表数据的第一部分开始。

其次,一旦您更改了可变 plist,只需调用setObject:forKey:适当的子字典 - 因此从外部字典中获取数组,从数组中获取内部字典,然后为键设置对象.

最后你需要把它写出来。readPlist为此,请使用诸如writeToFile:atomically:of 之类的方法来补充您的内容NSDictionary

于 2012-06-17T10:08:49.410 回答
2

在 iOS 的 NSUserDefault 中写入 Bool 值

write 
 [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"instructionCheck"];


Get
Bool flag=[[NSUserDefaults standardUserDefaults] boolForKey:@"instructionCheck"];
于 2015-09-05T10:19:27.207 回答
0

你可以indexPath从你的传递tableView给你的detailView。创建一个

@property (copy) NSIndexPath *indexPath;

在你的detailView并分配给它

detailView.indexPath = indexPath; // the one from the current selected cell

然后您可以创建一个喜欢的方法,如下所示:

- (IBAction)makeFavorite 
{ 
    NSArray *plist = [self readPlist]; 
    NSDictionary *theItem = [[[plist objectAtIndex:indexPath.section] valueForKey:@"Rows"] objectAtIndex:indexPath.row];
    // get the current state 
    BOOL fav = [[theItem valueForKey:@"isFav"] boolValue]; 
    // set the opposite of the current value 
    [theItem setValue:[NSNumber numberWithBool:!fav] forKey:@"isFav"]; 

    [self writePlist:plist]; 

    // update the UI, set new image or something
    self.navigationItem.rightBarButtonItem.image = [UIImage imageNamed:(!fav ? @"FullStar.png" : @"EmptyStar.png")];
}
于 2012-06-18T01:08:57.557 回答