使用NSUserDefults在UITableView上保留清单

时间:2011-09-23 12:28:36

标签: iphone objective-c xcode

我有一个非常简单的表格视图,显示了一个天数列表。一旦用户选择与他们相关的日期,此数据将保存在NSUserdefaults中。然后,一旦用户退出然后重新进入表格视图,我就需要保留复选标记。

我非常接近获得我想要的功能 - 我可以保存检查标记项目的数组,并使用NSUserDefaults保持它,但我不知道如何保持这些选择(在选中旁边留下一个复选标记item)一旦用户退出,则重新进入表格视图。

我知道我需要编辑 cellForRowAtIndexPath 方法,但我不确定该怎么做。任何帮助将不胜感激。

我在下面附上了我的代码:

#import "DayView.h"

@implementation DayView

@synthesize sourceArray;
@synthesize selectedArray;



- (id)init
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {
    // Custom initialization
    [[self navigationItem] setTitle:@"Days"];

    [[self tableView] setBackgroundColor:[UIColor clearColor]]; 

}
return self;
}

- (void)viewWillDisappear:(BOOL)animated
{
// create a standardUserDefaults variable
NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults];

// Convert array to string
NSString *time = [[selectedArray valueForKey:@"description"] componentsJoinedByString:@","];

// saving an NSString
[standardUserDefaults setObject:time forKey:@"string"];

NSLog(@"Disapear: %@", time);
}



- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad {
[super viewDidLoad];

// create a standardUserDefaults variable
NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults];

// getting an NSString object
NSString *myString = [standardUserDefaults stringForKey:@"string"];

NSLog(@"Appear: %@", myString);


NSMutableArray * tempArray = [[NSMutableArray alloc] init];
[self setSelectedArray:tempArray];
[tempArray release];

NSArray * tempSource = [[NSArray alloc] initWithObjects:@"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday",nil];
[self setSourceArray:tempSource];
[tempSource release];

[self.tableView reloadData];
}

#pragma mark -
#pragma mark Table view data source

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [self.sourceArray count];;
}


// Customize the appearance of table view cells.
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath   *)indexPath {

    static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}


NSString *time = [sourceArray objectAtIndex:indexPath.row];
cell.textLabel.text = time;


if ([self.selectedArray containsObject:[self.sourceArray objectAtIndex:indexPath.row]])

{
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
}
else
{
    [cell setAccessoryType:UITableViewCellAccessoryNone];
}


NSLog(@"Selected Days: %@", selectedArray);


return cell; 
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return @"Which times you are available?"; 
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

if ([self.selectedArray containsObject:[self.sourceArray objectAtIndex:indexPath.row]]){
    [self.selectedArray removeObjectAtIndex:[self.selectedArray indexOfObject:   [self.sourceArray objectAtIndex:indexPath.row]]];
}
else
{
    [self.selectedArray addObject:[self.sourceArray objectAtIndex:indexPath.row]];
}

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


@end

1 个答案:

答案 0 :(得分:0)

按如下方式创建tempSource:

NSMutableArray * tempSource = [[NSMutableArray alloc] init];
NSArray *daysOfWeek = [NSArray arrayWithObjects:@"Monday", @"tuestay", @"wednesday", @"thursday", @"friday", @"saturday", @"sunday",nil];
    for (int i = 0; i < 7; i++)
    {
        NSString *dayOfWeek = [daysOfWeek objectAtIndex:i];
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:dayOfWeek, @"day",   [NSNumber numberWithBool:NO], @"isSelected",nil];
       [tempSource addObject:dict];
    }

[self setSourceArray:tempSource];
[tempSource release];

然后在cellForRow和didSelect中使用此数组,如下所示:

cellForRow

NSDictionary *dayOfWeekDictionary = [sourceArray objectAtIntex:indexPath.row];

cell.textLabel.text = [dayOfWeekDictionary objectForKey:@"day"];
if ([[dayOfWeekDictionary objectForKey:@"isSelected"] boolValue])
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
else
    [cell setAccessoryType:UITableViewCellAccessoryNone];

didSelect

NSDictionary *dayOfWeekDictionary = [sourceArray objectAtIntex:indexPath.row];

if ([[dayOfWeekDictionary objectForKey:@"isSelected"] boolValue])
    [dayOfWeekDictionary setObject:[NSNumber numberWithBool:NO] forKey:@"isSelected"];
else
    [dayOfWeekDictionary setObject:[NSNumber numberWithBool:YES] forKey:@"isSelected"];

要保存此阵列,请使用以下语句:

[[NSUserDefaults standardUserDefaults] setObject:sourceArray forKey:@"array"];