在TableView Cell中保存复选框状态?

时间:2014-02-21 10:10:09

标签: ios uitableview plist selection

背景:我想创建一个应用程序,其中列出了某些人可能正在收集的书籍,这些书籍可以用作清单。我希望在完全启动测试之前让测试工作正常,到目前为止我已经成功完成了以下工作。

使用plist,UITableView和UITableCell我可以填充表格。该单元格包含缩略图,书名和二手价格。还有一个“复选框”按钮,用户可以在他们已经拿到书的情况下切换。我想要做的是保存退出时复选框切换的状态。也许将值存储到.plist中(我已将其复制到Documents目录中,以便在必要时可编辑)?或者还有另一种方式吗?我可以使用NSUserDefaults来做到这一点,但我怎么能得到它与每个单元格(书)相关?

正在运行的测试应用程序的屏幕截图(原谅现在的基本图形):

enter image description here

这是单元格布局和相关的.h文件:

enter image description here

以下是主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文件:

enter image description here

2 个答案:

答案 0 :(得分:1)

您可能希望使用Core Data前进,但您的plist会起作用。我会建议对plist进行一些更改:

  1. 我将根作为一个数组(这是一本书的列表)
  2. 我会将每个项目都设为字典(标题,价格和缩略图)
  3. 现在,每本书的所有数据都在同一个容器中。但是,更重要的是,您可以选择添加到该容器 - 因此您可以在某处存储所选状态。

答案 1 :(得分:1)

您应该改变将数据保存在plist中的方式。

应该是这样的:

enter image description here

对于表视图,选择当前[indexPath row]的objectAtIndex。 你可以从那些“book NSDictionary”中配置UITableViewCell - 如果需要你可以添加到那些对象“checked”属性并轻松修改它。

如果要在系统中删除/编辑/创建对象,这是更好的方法。 使用这种方法,您不会遇到缺少所选对象的索引等问题。

在您的UITableViewCell中拥有NSDictionary后,您可以添加以下属性:

[dict setValue:[NSNumber numberWithBool:YES] forKey:@"checked"];

获得价值:

[[dict valueForKey:@"checked"] boolValue];