如何保存uitableview中的复选标记,并在用户再次返回到视图时显示它们?
我正在使用下面的代码来显示uitableview中的复选标记
{ // NSArray *tableContents; NSMutableArray *selectedMarks; // You need probably to save the selected cells for use in the future. } @property (strong, nonatomic) IBOutlet UITableView *languageTableView; @property (nonatomic, strong) NSArray *tableContents; @end @implementation QPLanguageSettingsController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self initialisation]; selectedMarks = [NSMutableArray new]; } #pragma mark - View Life Cycle -(void)initialisation { _tableContents = [NSArray arrayWithObjects:@"English",@"Spanish",@"Russian",@"Arabic",@"Portuguese",@"French",@"German",@"German",@"German",@"German",@"German",@"German",@"German",@"German", nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - UITableView delegate & datasources - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 14; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"newFriendCell"; UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } //etc. cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.textLabel.textColor = [UIColor whiteColor]; cell.backgroundColor = [UIColor clearColor]; [cell setIndentationLevel:3]; [cell setIndentationWidth:10]; NSString *text = [_tableContents objectAtIndex:[indexPath row]]; //cell.isSelected = [selectedMarks containsObject:text] ? YES : NO; cell.textLabel.text = text; NSDictionary *item = [_tableContents objectAtIndex:indexPath.row]; if ([selectedMarks containsObject:item]) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } else { cell.accessoryType = UITableViewCellAccessoryNone; } return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; //if you want only one cell to be selected use a local NSIndexPath property instead of array. and use the code below //self.selectedIndexPath = indexPath; //the below code will allow multiple selection NSDictionary *item = [_tableContents objectAtIndex:indexPath.row]; if ([selectedMarks containsObject:item]) { [selectedMarks removeObject:item]; } else { [selectedMarks addObject:item]; } [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; }
但问题是,当我再次到视图控制器的所有复选标记消失。 如何解决它。 记得我在uitableview中使用了多个select。
我试图得到你的问题的解决scheme。我成功了。它完美的作品。
这是一个样本。试试这个代码。它工作正常。
ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property (strong, nonatomic) IBOutlet UITableView *tableViewCheckMarkPreviousSelectionUpdate; @end
ViewController.m
#import "ViewController.h" @interface ViewController () { NSMutableArray *arrProductSelection,*arrProductSelectDeSelectCheckMark; NSArray *arrayFetchFromDefaults; } @end @implementation ViewController @synthesize tableViewCheckMarkPreviousSelectionUpdate; - (void)viewDidLoad { [super viewDidLoad]; arrProductSelection = [[NSMutableArray alloc]initWithObjects:@"iPhone",@"iPad",@"iPod",@"iTV",@"iWatch",@"iMac",nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void)viewWillAppear:(BOOL)animated { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; arrayFetchFromDefaults = [userDefaults objectForKey:@"selectedcheckmark"]; arrProductSelectDeSelectCheckMark = [[NSMutableArray alloc]initWithArray:arrayFetchFromDefaults]; if(arrProductSelectDeSelectCheckMark.count == 0) { arrProductSelectDeSelectCheckMark = [[NSMutableArray alloc]init]; for(int j=0;j<[arrProductSelection count];j++) { [arrProductSelectDeSelectCheckMark addObject:@"deselected"]; } } [tableViewCheckMarkPreviousSelectionUpdate reloadData]; } #pragma mark - UITableViewDataSource Methods -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return arrProductSelection.count; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *strCell = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:strCell]; if(cell==nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCell]; } if([[arrProductSelectDeSelectCheckMark objectAtIndex:indexPath.row] isEqualToString:@"deselected"]) cell.accessoryType = UITableViewCellAccessoryNone; else cell.accessoryType = UITableViewCellAccessoryCheckmark; cell.textLabel.text = [arrProductSelection objectAtIndex:indexPath.row]; return cell; } #pragma mark - UITableViewDelegate Methods -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; @try { CGPoint touchPoint = [cell convertPoint:CGPointZero toView:tableViewCheckMarkSelectionUpdate]; NSIndexPath *indexPath = [tableViewCheckMarkSelectionUpdate indexPathForRowAtPoint:touchPoint]; NSLog(@"%@",arrProductSelectDeSelectCheckMark); if([arrProductSelectDeSelectCheckMark count]==0) { for(int i=0; i<[arrProductSelection count]; i++) { [arrProductSelectDeSelectCheckMark addObject:@"deselected"]; } } if([[arrProductSelectDeSelectCheckMark objectAtIndex:indexPath.row] isEqualToString:@"deselected"]) { cell.accessoryType = UITableViewCellAccessoryCheckmark; [arrProductSelectDeSelectCheckMark replaceObjectAtIndex:indexPath.row withObject:@"selected"]; } else { cell.accessoryType = UITableViewCellAccessoryNone; [arrProductSelectDeSelectCheckMark replaceObjectAtIndex:indexPath.row withObject:@"deselected"]; } NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:arrProductSelectDeSelectCheckMark forKey:@"selectedcheckmark"]; [defaults synchronize]; } @catch (NSException *exception) { NSLog(@"The exception is-%@",exception); } } @end
你有多个解决scheme:
- 在Core-data或SQLite等设备上使用一个合理的数据库,它实际上符合您的用例,但数字3更适合您的使用情况。
- 使用NSUserDefaults :
在运行时,使用
NSUserDefaults
对象来读取应用程序在用户的默认数据库中使用的默认值。 NSUserDefaultscaching信息以避免每次需要默认时都必须打开用户的默认数据库
你可以在这里find一个例子。 但NSUserDefaults
是保存设置/configuration/设置信息或用户信息,而不是您需要的用例。
- 使用我认为符合您的使用情况的NSCoder 。
你可以创build一个Singleton并在其上存储数据:
Singleton.h @interface Singleton : NSObject @property (nonatomic, strong) NSArray *rowsChecked; + (Singleton *)sharedInstance; + (NSArray *)getRowsChecked; + (void)setRowsChecked:(NSArray *)rowsChecked; @end
Singleton.m
#import "Singleton.h" @implementation Singleton static Singleton *sharedObject; + (Singleton *)sharedInstance; { if (sharedObject == nil) { static dispatch_once_t pred; dispatch_once(&pred, ^{ sharedObject = [[Singleton alloc] init]; }); } return sharedObject; } + (NSArray *)getRowsChecked { Singleton *singleton = [Singleton sharedInstance]; return singleton.rowsChecked; } + (void)setRowsChecked:(NSArray *)rowsChecked { Singleton *singleton = [Singleton sharedInstance]; singleton.rowsChecked= rowsChecked; } @end
并访问您的单身人士:
[[Singleton sharedInstance] getRowsChecked] // or [[Singleton sharedInstance] setRowsChecked:anArray];
使用下面的代码:
#import "ViewController.h" @interface ViewController ()<UITableViewDelegate, UITableViewDataSource> @property (weak, nonatomic) IBOutlet UITableView *languagesTableView; @property (strong, nonatomic) NSArray *languagesArray; @property (strong, nonatomic) NSMutableArray *checkMarksArray; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self.languagesTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"]; self.languagesArray = [NSArray arrayWithObjects:@"English",@"Spanish",@"Russian",@"Arabic",@"Portuguese",@"French",@"German", nil]; self.checkMarksArray = [[NSMutableArray alloc]init]; if( [[NSUserDefaults standardUserDefaults]objectForKey:@"selectedRowsArray"]) { self.checkMarksArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"selectedRowsArray"] mutableCopy]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.languagesArray.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *languagesCell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; languagesCell.textLabel.text = self.languagesArray[indexPath.row]; if([self.checkMarksArray containsObject:[NSNumber numberWithLong:indexPath.row]]) { languagesCell.accessoryType = UITableViewCellAccessoryCheckmark; } else { languagesCell.accessoryType = UITableViewCellAccessoryNone; } [[NSUserDefaults standardUserDefaults]setObject:self.checkMarksArray forKey:@"selectedRowsArray"]; [[NSUserDefaults standardUserDefaults]synchronize]; return languagesCell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ if([self.checkMarksArray containsObject:[NSNumber numberWithLong:indexPath.row]]) { [self.checkMarksArray removeObject:[NSNumber numberWithLong:indexPath.row]]; } else { [self.checkMarksArray addObject:[NSNumber numberWithLong:indexPath.row]]; } [self.languagesTableView reloadData]; } @end
检查这个GitHub链接: