背景
我有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
}
答案 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)
您可以将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")];
}