如何保存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:

  1. 在Core-data或SQLite等设备上使用一个合理的数据库,它实际上符合您的用例,但数字3更适合您的使用情况。
  2. 使用NSUserDefaults :

在运行时,使用NSUserDefaults对象来读取应用程序在用户的默认数据库中使用的默认值。 NSUserDefaultscaching信息以避免每次需要默认时都必须打开用户的默认数据库

你可以在这里find一个例子。 但NSUserDefaults是保存设置/configuration/设置信息或用户信息,而不是您需要的用例。

  1. 使用我认为符合您的使用情况的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链接:

https://github.com/k-sathireddy/TableViewSelectedCheckMarks