将BOOL值从按钮写入plist

时间:2012-06-17 09:16:10

标签: objective-c uitableview plist

背景

我有2个tableViews,第一个是Main表,第二个是Favorites表。

一切都是用钳子处理的。

从第一张表的detailView,在上角我设置了一个按钮,用于向plist写入值YES。

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 bool值写入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 个答案:

答案 0 :(得分:3)

您在寻找:

[myDictionary setObject:[NSNumber numberWithBool:NO] forKey:@"isFav"]

答案 1 :(得分:2)

概述,没有特别涉及的步骤:

如果您打算更改它,首先需要可变字典。如果你为ditionaryWithContentsOfFile:(明显地)调用这个,那么用NSDictionary读一个plist会产生一个不可变的。(/ p>)

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

还可以在plist中读取其他方法,让您指定需要可变对象,从Reading and Writing Property List data的第一部分开始。

其次,一旦你有可变plist更改它只是在相应的子字典上调用setObject:forKey: - 所以从外部字典中获取数组,从你获得内部字典的数组,和然后你设置密钥的对象。

最后你需要写出来。为此,请撰写readPlist的补充内容,使用writeToFile:atomically: NSDictionary等{{1}}等方法。

答案 2 :(得分:2)

在iOS中的NSUserDefault中写入Bool值

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


Get
Bool flag=[[NSUserDefaults standardUserDefaults] boolForKey:@"instructionCheck"];

答案 3 :(得分:0)

您可以将indexPathtableView传递到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")];
}