开发者

Persisting Checklists on a UITableView using NSUserDefults

I have a very simple table view which shows a list of days. Once the user selects which days are relevant to them this data is saved in NSUserdefaults. I then need the check marks to remain once the user has exited then re-entered the table view.

I am very close to getting my desired functionality - I can save the array of check marked items and get it to persist using NSUserDefaults but I don't know how to make these selections persist (keep a check mark next to the selected item) once a user has exited then re-entered the table view.

I know that I need to edit the cellForRowAtIndexPath method but I am not sure exactly what to do. Any help would be greatly appreciated.

I have attached my code below:

#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 = [[[UITableView开发者_C百科Cell 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


Create your tempSource as follows:

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];

Then use this Array in cellForRow and didSelect as follows:

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"];

To save this Array use this statement:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜