【问题标题】:Save checkbox state in TableView Cell? [duplicate]在 TableView 单元格中保存复选框状态? [复制]
【发布时间】:2014-03-22 18:42:32
【问题描述】:

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

使用 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 文件:

【问题讨论】:

标签: ios uitableview plist selection


【解决方案1】:

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

应该是这样的:

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

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

一旦你的 UITableViewCell 中有 NSDictionary,你就可以像这样添加该属性:

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

获取价值:

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

【讨论】:

  • 好的,有道理,但没有回答如何存储按钮的“切换”状态的主要问题。
  • 我已经更改了 .plist 但现在我的 UITableView 没有填充。我需要对 ViewController .m 文件进行哪些更改才能使其现在工作?
  • 您需要更新所有与 UITableViewCell 数据源相关的方法。从中获取行数并进一步从中获取对象。更新如此简单 - 您是否编写了自己粘贴的代码?你听得懂么 ?或者是教程副本
  • 两者兼而有之。我正在努力理解它。 :)
  • 好的,阅读表格视图的文档并考虑一下 :) 您需要更新返回单元格数量的代码以及稍后创建单元格的代码。这真的很基本,谷歌出来并结合我的答案。我已经帮助你两次了,你没有接受我的任何回答,对不起
【解决方案2】:

您可能希望继续使用 Core Data,但您的 plist 将起作用。不过,我建议对 plist 进行一些更改:

  1. 我会将根设为数组(这是书籍列表)
  2. 我会将每个项目都制作成字典(带有标题、价格和缩略图)

现在,每本书的所有数据都在同一个容器中。但是,更重要的是,您可以选择添加到该容器 - 因此您可以在某个地方存储所选状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多