背景:我想创建一个应用程序,其中列出了某些人可能正在收集的书籍,这些书籍可以用作清单。我希望在完全启动测试之前让测试工作正常,到目前为止我已经成功完成了以下工作。
使用plist,UITableView和UITableCell我可以填充表格。该单元格包含缩略图,书名和二手价格。还有一个“复选框”按钮,用户可以在他们已经拿到书的情况下切换。我想要做的是保存退出时复选框切换的状态。也许将值存储到.plist中(我已将其复制到Documents目录中,以便在必要时可编辑)?或者还有另一种方式吗?我可以使用NSUserDefaults来做到这一点,但我怎么能得到它与每个单元格(书)相关?
正在运行的测试应用程序的屏幕截图(原谅现在的基本图形):
这是单元格布局和相关的.h文件:
以下是主ViewController .m文件的代码:
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Find out the path of books_star.plist
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
// Load the file content and read the data into arrays
NSString *myListPath = [documentsDirectory stringByAppendingPathComponent:@"books_star.plist"];
tableData = [[NSArray alloc]initWithContentsOfFile:myListPath];
NSLog(@"%@",tableData);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [tableData count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *books_starTableIdentifier = @"booksCell";
booksCell *cell = (booksCell *)[tableView dequeueReusableCellWithIdentifier:books_starTableIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"booksCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
cell.titleLabel.text = [[tableData objectAtIndex:indexPath.row]objectForKey:@"title"];
cell.thumbnailImageView.image = [UIImage imageNamed: [[tableData objectAtIndex:indexPath.row]objectForKey:@"thumbnail"]];
cell.priceLabel.text = [[tableData objectAtIndex:indexPath.row]objectForKey:@"price"];
return cell;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 96;
}
@end
这是Cell .m文件的代码:
#import "booksCell.h"
@implementation booksCell
@synthesize titleLabel = _titleLabel;
@synthesize priceLabel = _priceLabel;
@synthesize thumbnailImageView = _thumbnailImageView;
@synthesize checkBoxButton;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {}
return self;}
- (void) awakeFromNib {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
checked = [defaults boolForKey:@"boxIsChecked"];
[self checkTheBox];
}
- (IBAction)checkButton:(id)sender {
if (!checked) {
[checkBoxButton setImage:[UIImage imageNamed:@"check_on.png"] forState:UIControlStateNormal];
checked = YES;
NSMutableDictionary *plist = [NSMutableDictionary dictionaryWithContentsOfFile:@"books_star.plist"];
[plist setObject:[NSNumber numberWithBool:YES] forKey:@"check"];
[plist writeToFile:@"books_star.plist" atomically:YES];
}
else if (checked) {
[checkBoxButton setImage:[UIImage imageNamed:@"check_off.png"] forState:UIControlStateNormal];
checked = NO;
}
}
- (void) checkTheBox {
if (!checked) {
[checkBoxButton setImage:[UIImage imageNamed:@"check_off.png"] forState:UIControlStateNormal];
}
else if (checked) {
[checkBoxButton setImage:[UIImage imageNamed:@"checkBox_on.png"] forState:UIControlStateNormal];}
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
最后这是.plist文件:
答案 0 :(得分:1)
您可能希望使用Core Data前进,但您的plist会起作用。我会建议对plist进行一些更改:
现在,每本书的所有数据都在同一个容器中。但是,更重要的是,您可以选择添加到该容器 - 因此您可以在某处存储所选状态。
答案 1 :(得分:1)
您应该改变将数据保存在plist中的方式。
应该是这样的:
对于表视图,选择当前[indexPath row]的objectAtIndex。 你可以从那些“book NSDictionary”中配置UITableViewCell - 如果需要你可以添加到那些对象“checked”属性并轻松修改它。
如果要在系统中删除/编辑/创建对象,这是更好的方法。 使用这种方法,您不会遇到缺少所选对象的索引等问题。
在您的UITableViewCell中拥有NSDictionary后,您可以添加以下属性:
[dict setValue:[NSNumber numberWithBool:YES] forKey:@"checked"];
获得价值:
[[dict valueForKey:@"checked"] boolValue];