2016-09-27 45 views
1

我使用下面的代码显示在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中使用了多个选择。

+0

存储数据或Plist或用户默认值。 –

+0

如何将此存储在nsuserdefaults中,请发布代码 –

+0

保存您在数组中检查标记,然后使用userdefaults保存数组''[NSUserDefaults standardUserDefaults] setObject:yourdataAry forKey:@“checkMarks”];或使用本地数据库。 – vaibhav

回答

3

我试着为你的问题得到解决方案。我成功了。它完美的工作。

这是示例one.Try this code.It works fine。

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 
+0

谢谢....有什么办法可以获得数组中选定的项目? –

+0

在arrProductSelectDeSelectCheckMark数组中,我们可以选择并取消选择项目。 – user3182143

0

你有多个解决方案:

  1. Core-dataSQLite这实际上符合你的使用情况,但3号是更适合您的使用情况下,设备上使用合理的DB。
  2. 使用NSUserDefaults

在运行时,您可以使用NSUserDefaults对象读取您的应用程序从用户的默认数据库使用的默认值。 NSUserDefaults缓存信息,以避免每次需要默认打开用户的默认数据库时

您可以找到一个示例here。但NSUserDefaults是保存设置/配置/设置信息或用户信息,而不是您需要的用例。

  1. 使用NSCoder这在我看来符合您的使用案例。
+0

请告诉我如何使用nsuserdefaults –

+0

您是否阅读过答案?另外,你应该避免在NSUserDefaults中保存你需要的东西。你需要的是NSCoder。 – OhadM

0

可以在其上建立一个独立的,并存储数据:

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

很酷,那么他是如何插入并通过遵循你的ans得到检查的数组? – vaibhav

+0

访问getRowsChecked并插入setRowsChecked –

+0

那么一次可以保存多少个实例..如果多个复选标记数组需要保存,该怎么办? – vaibhav

0

使用下面的代码:

#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的链接:在核心数据或sqlite的

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

+0

我检查了...有没有什么办法让逗号附加选定的行值? –

+0

你想将数组转换为逗号分隔的字符串? – KSR

相关问题