如何在uitableview中保存复选标记,并在用户再次返回视图时显示它们?

时间:2016-09-27 12:17:20

标签: ios objective-c 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中使用了多个选择。

4 个答案:

答案 0 :(得分:3)

我试着为你的问题找到解决方案。我成功了。它运作得很好。

这是示例一。试试这段代码。工作正常。

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

答案 1 :(得分:0)

您有多种解决方案:

  1. Core-dataSQLite等设备上使用合理数据库,它实际上符合您的使用案例,但数字3更适合您的使用案例。
  2. 使用NSUserDefaults
  3.   

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

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

    1. 使用我认为适合您用例的NSCoder

答案 2 :(得分:0)

您可以创建一个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:

[[Singleton sharedInstance] getRowsChecked]

// or

[[Singleton sharedInstance] setRowsChecked:anArray];

答案 3 :(得分: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链接:

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