为啥当我在目标 c 中重新加载表视图时选择的值会被取消选择

Posted

技术标签:

【中文标题】为啥当我在目标 c 中重新加载表视图时选择的值会被取消选择【英文标题】:Why Selected value get deselect when I reload table view in objective c为什么当我在目标 c 中重新加载表视图时选择的值会被取消选择 【发布时间】:2017-01-07 10:37:18 【问题描述】:

我是 ios 新手,在自定义表格视图中遇到问题。我正在使用自定义表格视图单元格

AuditTableviewcell.h

    NSString *ActualString;
    IBOutlet UIButton *infobtn;
    UITextField * alertTextField;
    UITextView *textView1;

    UILabel *lbl;


-(IBAction)passbtnClick:(id)sender;
-(IBAction)failbtnClick:(id)sender;
-(IBAction)wipbtnClick:(id)sender;
-(IBAction)nabtnClick:(id)sender;
-(IBAction)infobtnClick:(id)sender;

@property(nonatomic,strong)IBOutlet UILabel *audittitlelbl;
@property(nonatomic,strong)IBOutlet UILabel *listlbl;

@property(nonatomic,strong) IBOutlet UILabel *passlbl;
@property(nonatomic,strong) IBOutlet UILabel *faillbl;
@property(nonatomic,strong) IBOutlet UILabel *warninglbl;
@property(nonatomic,strong) IBOutlet UILabel *nalbl;
@property(nonatomic,strong) IBOutlet UILabel *actuallbl;
@property(nonatomic,strong) IBOutlet UILabel *nameidlbl;
@property(nonatomic,strong) IBOutlet UILabel *remarklbl;

@property(nonatomic,strong) IBOutlet UIButton *passbtn;
@property(nonatomic,strong) IBOutlet UIButton *failbtn;
@property(nonatomic,strong) IBOutlet UIButton *wipbtn;
@property(nonatomic,strong) IBOutlet UIButton *nabtn;

AuditTableviewcell.m

@synthesize audittitlelbl,listlbl,passbtn,nabtn,passlbl,faillbl,warninglbl,nalbl,actuallbl,failbtn,wipbtn,nameidlbl;
- (void)awakeFromNib 

    passbtn.layer.cornerRadius = passbtn.bounds.size.width / 2.0;// this value vary as per your desire
    passbtn.clipsToBounds = YES;

    failbtn.layer.cornerRadius = failbtn.bounds.size.width / 2.0;// this value vary as per your desire
    failbtn.clipsToBounds = YES;

    wipbtn.layer.cornerRadius = wipbtn.bounds.size.width / 2.0;// this value vary as per your desire
    wipbtn.clipsToBounds = YES;

    nabtn.layer.cornerRadius = nabtn.bounds.size.width / 2.0;// this value vary as per your desire
    nabtn.clipsToBounds = YES;

    infobtn.layer.cornerRadius = infobtn.bounds.size.width / 2.0;// this value vary as per your desire
    [[infobtn layer] setBorderWidth:1.0f];
    infobtn.layer.borderColor =[[UIColor blueColor] CGColor];
    infobtn.clipsToBounds = YES;

    passlbl.hidden=YES;
    faillbl.hidden=YES;
    warninglbl.hidden=YES;
    nalbl.hidden=YES;
    actuallbl.hidden=YES;
    nameidlbl.hidden=YES;

    // Initialization code

- (void)textViewDidEndEditing:(UITextView *)theTextView

    if (![textView1 hasText]) 
        lbl.hidden = NO;
    


- (void) textViewDidChange:(UITextView *)textView

    if(![textView hasText]) 
        lbl.hidden = NO;
    
    else
        lbl.hidden = YES;
      



-(IBAction)passbtnClick:(id)sender

    passbtn.backgroundColor=[UIColor greenColor];
    failbtn.backgroundColor=[UIColor lightGrayColor];
    wipbtn.backgroundColor=[UIColor lightGrayColor];
    nabtn.backgroundColor=[UIColor lightGrayColor];

    actuallbl.text=passlbl.text;
    ActualString=actuallbl.text;

-(IBAction)failbtnClick:(id)sender

    passbtn.backgroundColor=[UIColor lightGrayColor];
    failbtn.backgroundColor=[UIColor redColor];
    wipbtn.backgroundColor=[UIColor lightGrayColor];
    nabtn.backgroundColor=[UIColor lightGrayColor];

    actuallbl.text=faillbl.text;
    ActualString=actuallbl.text;
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:ActualString forKey:@"ActualStringCustom"];

    UIAlertView *testAlert = [[UIAlertView alloc] initWithTitle:@"Fail!"
                                                        message:audittitlelbl.text
                                                       delegate:self
                                              cancelButtonTitle:nil
                                              otherButtonTitles:@"Done", nil];
    textView1 = [UITextView new];
    lbl = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0,90.0, 34.0)];


    [lbl setText:@"Enter Remark"];
    [lbl setFont:[UIFont systemFontOfSize:12]];
    [lbl setBackgroundColor:[UIColor clearColor]];
    [lbl setTextColor:[UIColor lightGrayColor]];
    textView1.delegate = self;

    [textView1 addSubview:lbl];

    [testAlert setValue: textView1 forKey:@"accessoryView"];

    [testAlert show];


-(IBAction)wipbtnClick:(id)sender

    passbtn.backgroundColor=[UIColor lightGrayColor];
    failbtn.backgroundColor=[UIColor lightGrayColor];
    wipbtn.backgroundColor=[UIColor orangeColor];
    nabtn.backgroundColor=[UIColor lightGrayColor];

    actuallbl.text=warninglbl.text;
    ActualString=actuallbl.text;


    UIAlertView *testAlert = [[UIAlertView alloc] initWithTitle:@"Warning!"
                                                        message:audittitlelbl.text
                                                       delegate:self
                                              cancelButtonTitle:nil
                                              otherButtonTitles:@"Done", nil];
    textView1 = [UITextView new];
    lbl = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0,90.0, 34.0)];
     [lbl setText:@"Enter Remark"];
    [lbl setFont:[UIFont systemFontOfSize:12]];
    [lbl setBackgroundColor:[UIColor clearColor]];
    [lbl setTextColor:[UIColor lightGrayColor]];
    textView1.delegate = self;

    [textView1 addSubview:lbl];

    [testAlert setValue: textView1 forKey:@"accessoryView"];

    [testAlert show];


- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 

    if(buttonIndex==0)
    

    

-(IBAction)nabtnClick:(id)sender

    passbtn.backgroundColor=[UIColor lightGrayColor];
    failbtn.backgroundColor=[UIColor lightGrayColor];
    wipbtn.backgroundColor=[UIColor lightGrayColor];
    nabtn.backgroundColor=[UIColor blueColor];
    actuallbl.text=nalbl.text;
    ActualString=actuallbl.text;



-(IBAction)infobtnClick:(id)sender

    UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"info" message:@"Information to be displayed" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];

ViewController.m

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
   
            static NSString *STI=@"STI";
            AuditTableViewCell *cell = (AuditTableViewCell *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:STI];
            if (cell == nil)
            
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AuditTableViewCell" owner:self options:nil];
                cell = [nib objectAtIndex:0];
                cell.accessoryType=UITableViewCellAccessoryNone;
            
            cell.audittitlelbl.text=[NSString stringWithFormat:@"%@",[idarray objectAtIndex:indexPath.row]];
            cell.nameidlbl.text=[NSString stringWithFormat:@"%@",[CheckpointNameIDArray objectAtIndex:indexPath.row]];
            cell.passlbl.text=[NSString stringWithFormat:@"%@",[Passarray objectAtIndex:indexPath.row]];
            cell.faillbl.text=[NSString stringWithFormat:@"%@",[Failarray objectAtIndex:indexPath.row]];
            cell.warninglbl.text=[NSString stringWithFormat:@"%@",[Warningarray objectAtIndex:indexPath.row]];
            cell.nalbl.text=[NSString stringWithFormat:@"%@",[NAarray objectAtIndex:indexPath.row]];


            [cell.passbtn addTarget:self action:@selector(btnQuantityPressedPass:) forControlEvents:UIControlEventTouchUpInside];
            [cell.failbtn addTarget:self action:@selector(btnQuantityPressedFail:) forControlEvents:UIControlEventTouchUpInside];
             [cell.wipbtn addTarget:self action:@selector(btnQuantityPressedWarning:) forControlEvents:UIControlEventTouchUpInside];
             [cell.nabtn addTarget:self action:@selector(btnQuantityPressedNA:) forControlEvents:UIControlEventTouchUpInside];
            [cell.contentView.layer setBorderColor:[UIColor blackColor].CGColor];
            [cell.contentView.layer setBorderWidth:0.5f];

            return cell;
       

//TODO: PassButton from Cell method

-(void)btnQuantityPressedPass:(UIButton *)sender

    AuditTableViewCell *cell = sender.superview.superview;
    NSString *String =cell.actuallbl.text;
    NSString *String2=cell.nameidlbl.text;
    NSString *FailString=@"";
    NSString *WarningString=@"";
    NSLog(@"String =%@",String);

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:String forKey:@"ActualStringCustom"];
    [defaults setObject:String2 forKey:@"CheckPointNameID"];

    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

    //  NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSLog(@"Result =%@",results);

        ComplareArray=[devices valueForKey:@"checkpointid"];

        BOOL contains = [ComplareArray containsObject:String2];

        if(contains == NO)
        
            if (self.device) 
                // Update existing device
                [device setValue:Audit forKey:@"auditnameId"];
                [device setValue:String forKey:@"checklistid"];
                [device setValue:String2 forKey:@"checkpointid"];
                [device setValue:FailString forKey:@"failreason"];
                [device setValue:WarningString forKey:@"warningreason"];
                [device setValue:AuditStartDate forKey:@"starttimedate"];
                [device setValue:userid forKey:@"userid"];

                NSError *error = nil;
                // Save the object to persistent store
                if (![context save:&error]) 
                    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
                



             else 
            // Create a new device
                NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"AuditPost" inManagedObjectContext:context];
                [newDevice setValue:Audit forKey:@"auditnameId"];
                [newDevice setValue:String forKey:@"checklistid"];
                [newDevice setValue:String2 forKey:@"checkpointid"];
                [newDevice setValue:FailString forKey:@"failreason"];
                [newDevice setValue:WarningString forKey:@"warningreason"];
                [newDevice setValue:AuditStartDate forKey:@"starttimedate"];
                [newDevice setValue:userid forKey:@"userid"];

                NSError *error = nil;
                // Save the object to persistent store
                if (![context save:&error]) 
                    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
                
             

        
        else
        
            NSError *error = nil;
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            

            ///
            NSManagedObjectContext *context = [self managedObjectContext];

            NSFetchRequest *request = [[NSFetchRequest alloc] init];
            [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

            //  NSError *error = nil;
            NSArray *results = [context executeFetchRequest:request error:&error];
            NSManagedObject* favoritsGrabbed = [results objectAtIndex:CurrentIndexPath];
            [favoritsGrabbed setValue:String forKey:@"checklistid"];
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            
        


//TODO: FailButton from Cell method

-(void)btnQuantityPressedFail:(UIButton *)sender

    AuditTableViewCell *cell = sender.superview.superview;
    NSString *String =cell.actuallbl.text;
    NSString *String2=cell.nameidlbl.text;
    NSLog(@"String =%@",String);
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:String forKey:@"ActualStringCustom"];
    [defaults setObject:String2 forKey:@"CheckPointNameID"];
    NSString *FailString=@"";
    NSString *WarningString=@"";

    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

    //  NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSLog(@"Result =%@",results);

    ComplareArray=[devices valueForKey:@"checkpointid"];

    BOOL contains = [ComplareArray containsObject:String2];

    if(contains == NO)
    
        if (self.device) 
            // Update existing device
            [device setValue:Audit forKey:@"auditnameId"];
            [device setValue:String forKey:@"checklistid"];
            [device setValue:String2 forKey:@"checkpointid"];
            [device setValue:FailString forKey:@"failreason"];
            [device setValue:WarningString forKey:@"warningreason"];
            [device setValue:AuditStartDate forKey:@"starttimedate"];
            [device setValue:userid forKey:@"userid"];

            NSError *error = nil;
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            

         else 
            // Create a new device
            NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"AuditPost" inManagedObjectContext:context];
            [newDevice setValue:Audit forKey:@"auditnameId"];
            [newDevice setValue:String forKey:@"checklistid"];
            [newDevice setValue:String2 forKey:@"checkpointid"];
            [newDevice setValue:FailString forKey:@"failreason"];
            [newDevice setValue:WarningString forKey:@"warningreason"];
            [newDevice setValue:AuditStartDate forKey:@"starttimedate"];
            [newDevice setValue:userid forKey:@"userid"];

            NSError *error = nil;
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            
       

    
    else
    
        NSError *error = nil;
        // Save the object to persistent store
        if (![context save:&error]) 
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        

        ///
        NSManagedObjectContext *context = [self managedObjectContext];

        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

        //  NSError *error = nil;
        NSArray *results = [context executeFetchRequest:request error:&error];
        NSManagedObject* favoritsGrabbed = [results objectAtIndex:CurrentIndexPath];
        [favoritsGrabbed setValue:String forKey:@"checklistid"];
        // Save the object to persistent store
        if (![context save:&error]) 
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        
    


//TODO: WarningButton from Cell method

-(void)btnQuantityPressedWarning:(UIButton *)sender

    AuditTableViewCell *cell = sender.superview.superview;

    NSIndexPath *indexPath = [Audittable indexPathForCell:cell];
    CurrentIndexPath=indexPath.row;

    // NSLog(@"%@",cell.actuallbl.text);

    NSString *String =cell.actuallbl.text;
    NSString *String2=cell.nameidlbl.text;
    NSLog(@"String =%@",String);
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:String forKey:@"ActualStringCustom"];
    [defaults setObject:String2 forKey:@"CheckPointNameID"];

    NSString *FailString=@"";
    NSString *WarningString=@"";

    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error;


    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

    //  NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSLog(@"Result =%@",results);

    ComplareArray=[devices valueForKey:@"checkpointid"];

    BOOL contains = [ComplareArray containsObject:String2];

    if(contains == NO)
    
        if (self.device) 
            // Update existing device
            [device setValue:Audit forKey:@"auditnameId"];
            [device setValue:String forKey:@"checklistid"];
            [device setValue:String2 forKey:@"checkpointid"];
            [device setValue:FailString forKey:@"failreason"];
            [device setValue:WarningString forKey:@"warningreason"];
            [device setValue:AuditStartDate forKey:@"starttimedate"];
            [device setValue:userid forKey:@"userid"];

            NSError *error = nil;
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            
        else 
            // Create a new device
            NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"AuditPost" inManagedObjectContext:context];
            [newDevice setValue:Audit forKey:@"auditnameId"];
            [newDevice setValue:String forKey:@"checklistid"];
            [newDevice setValue:String2 forKey:@"checkpointid"];
            [newDevice setValue:FailString forKey:@"failreason"];
            [newDevice setValue:WarningString forKey:@"warningreason"];
            [newDevice setValue:AuditStartDate forKey:@"starttimedate"];
            [newDevice setValue:userid forKey:@"userid"];

            NSError *error = nil;
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            
        
    
    else
    
        NSError *error = nil;
        // Save the object to persistent store
        if (![context save:&error]) 
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        

        ///
        NSManagedObjectContext *context = [self managedObjectContext];

        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

        //  NSError *error = nil;
        NSArray *results = [context executeFetchRequest:request error:&error];
        NSManagedObject* favoritsGrabbed = [results objectAtIndex:CurrentIndexPath];
        [favoritsGrabbed setValue:String forKey:@"checklistid"];
        // Save the object to persistent store
        if (![context save:&error]) 
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        
    


//TODO: NAButton from Cell method

-(void)btnQuantityPressedNA:(UIButton *)sender

    AuditTableViewCell *cell = sender.superview.superview;
    // NSLog(@"%@",cell.actuallbl.text);

    NSString *String =cell.actuallbl.text;
     NSString *String2=cell.nameidlbl.text;
    NSLog(@"String =%@",String);
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    [defaults setObject:String forKey:@"ActualStringCustom"];
    [defaults setObject:String2 forKey:@"CheckPointNameID"];

    NSString *FailString=@"";
    NSString *WarningString=@"";

    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error;


    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

    //  NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSLog(@"Result =%@",results);

    ComplareArray=[devices valueForKey:@"checkpointid"];

    BOOL contains = [ComplareArray containsObject:String2];

    if(contains == NO)
    
        if (self.device) 
            // Update existing device
            [device setValue:Audit forKey:@"auditnameId"];
            [device setValue:String forKey:@"checklistid"];
            [device setValue:String2 forKey:@"checkpointid"];
            [device setValue:FailString forKey:@"failreason"];
            [device setValue:WarningString forKey:@"warningreason"];
            [device setValue:AuditStartDate forKey:@"starttimedate"];
            [device setValue:userid forKey:@"userid"];

            NSError *error = nil;
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            
        else 
            // Create a new device
            NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"AuditPost" inManagedObjectContext:context];
            [newDevice setValue:Audit forKey:@"auditnameId"];
            [newDevice setValue:String forKey:@"checklistid"];
            [newDevice setValue:String2 forKey:@"checkpointid"];
            [newDevice setValue:FailString forKey:@"failreason"];
            [newDevice setValue:WarningString forKey:@"warningreason"];
            [newDevice setValue:AuditStartDate forKey:@"starttimedate"];
            [newDevice setValue:userid forKey:@"userid"];

            NSError *error = nil;
            // Save the object to persistent store
            if (![context save:&error]) 
                NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
            
       
    
    else
    
        NSError *error = nil;
        // Save the object to persistent store
        if (![context save:&error]) 
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        

        ///
        NSManagedObjectContext *context = [self managedObjectContext];

        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:[NSEntityDescription entityForName:@"AuditPost" inManagedObjectContext:context]];

        //  NSError *error = nil;
        NSArray *results = [context executeFetchRequest:request error:&error];
        NSManagedObject* favoritsGrabbed = [results objectAtIndex:CurrentIndexPath];
        [favoritsGrabbed setValue:String forKey:@"checklistid"];
        // Save the object to persistent store
        if (![context save:&error]) 
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        
    


如图所示,我选择通过按钮

但是当我重新加载表格时,选择按钮会取消选择

重新加载表格时如何获取选定的值。在此先感谢!

【问题讨论】:

最好保留任何选定值的数组并将其设置在 tableview cellForRowAtIndex 方法中 @KrishnaCA 怎么做你能分享代码。它是一个自定义表格视图。 这么多代码,考虑重新设计一下你的tableview!读代码很奇怪。首先,如果您想在 tableView 中设置值,您应该在 cellForRowAtIndexPath 方法中进行。想想一个里面有对象的数组。因此,如果您单击单元格中的按钮,则可以获取所选行的 indexPath 并通过该方式获取单元格中显示的对象。然后您可以更改对象的状态,并且您的 tableview 不会失去您之前设置的状态... @Muju,请检查编辑后的答案,让我知道我能做些什么让你更清楚 模型类你知道吗 【参考方案1】:

在 ios 表格视图中为每一行重用单元格,所以它确实发生了。 您使用模型类来管理选择。我在单元格上的按钮上添加了选择器。还有重新加载表格视图的示例。请检查以下代码。

//
//  ViewController.m

#import "ViewController.h"
#import "DataModel.h"
#import "MyTableViewCell.h"

@interface ViewController ()

    NSMutableArray *arrData;


@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    arrData = [[NSMutableArray alloc]init];

    // create 15 model and store in array
    for (int i =0; i<15; i++)
    
        DataModel *model = [DataModel new];
        model.strSelected = @"";
        [arrData addObject:model];

    



- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return  arrData.count;



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    MyTableViewCell *cell = [self.tblView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    // tag add on buttons
    cell.btnPPressed.tag = indexPath.row;
    cell.btnFPressed.tag = indexPath.row;
    cell.btnWPressed.tag = indexPath.row;
    cell.btnNAPressed.tag = indexPath.row;

    //method add on buttons
    [cell.btnPPressed addTarget:self action:@selector(btnP:) forControlEvents:UIControlEventTouchUpInside];
    [cell.btnFPressed addTarget:self action:@selector(btnF:) forControlEvents:UIControlEventTouchUpInside];
    [cell.btnWPressed addTarget:self action:@selector(btnW:) forControlEvents:UIControlEventTouchUpInside];
    [cell.btnNAPressed addTarget:self action:@selector(btnNA:) forControlEvents:UIControlEventTouchUpInside];


    //background color change on button
    DataModel *model = [arrData objectAtIndex:indexPath.row];
    if([model.strSelected isEqualToString:@"P"])
    
        cell.btnPPressed.backgroundColor = [UIColor redColor];
    
   else if([model.strSelected isEqualToString:@"F"])
    
        cell.btnFPressed.backgroundColor = [UIColor redColor];
    
   else if([model.strSelected isEqualToString:@"W"])
   
       cell.btnWPressed.backgroundColor = [UIColor redColor];
   
   else if([model.strSelected isEqualToString:@"NA"])
   
       cell.btnNAPressed.backgroundColor = [UIColor redColor];
   
   else
   
       cell.btnPPressed.backgroundColor = [UIColor darkGrayColor];
       cell.btnFPressed.backgroundColor = [UIColor darkGrayColor];
       cell.btnWPressed.backgroundColor = [UIColor darkGrayColor];
       cell.btnNAPressed.backgroundColor = [UIColor darkGrayColor];

   


    return cell;



//buttons methods

-(void)btnP:(UIButton *)sender

    sender.backgroundColor = [UIColor redColor];
    DataModel *model = [arrData objectAtIndex:sender.tag];
    model.strSelected = @"P";

    //example reload table
    dispatch_async(dispatch_get_main_queue(), ^
        [self.tblView reloadData];
    );




-(void)btnF:(UIButton *)sender

    sender.backgroundColor = [UIColor redColor];
    DataModel *model = [arrData objectAtIndex:sender.tag];
    model.strSelected = @"F";

    //example reload table
    dispatch_async(dispatch_get_main_queue(), ^
        [self.tblView reloadData];
    );



-(void)btnW:(UIButton *)sender

    sender.backgroundColor = [UIColor redColor];
    DataModel *model = [arrData objectAtIndex:sender.tag];
    model.strSelected = @"W";


    //example reload table
    dispatch_async(dispatch_get_main_queue(), ^
        [self.tblView reloadData];
    );


-(void)btnNA:(UIButton *)sender

    sender.backgroundColor = [UIColor redColor];
    DataModel *model = [arrData objectAtIndex:sender.tag];
    model.strSelected = @"NA";


    //example reload table
    dispatch_async(dispatch_get_main_queue(), ^
        [self.tblView reloadData];
    );



@end


//  DataModel.h
#import <Foundation/Foundation.h>

@interface DataModel : NSObject
@property(nonatomic, strong)NSString *strSelected;

@end


//  MyTableViewCell.h
#import <UIKit/UIKit.h>

@interface MyTableViewCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UIButton *btnPPressed;
@property (strong, nonatomic) IBOutlet UIButton *btnFPressed;
@property (strong, nonatomic) IBOutlet UIButton *btnWPressed;
@property (strong, nonatomic) IBOutlet UIButton *btnNAPressed;

@end

【讨论】:

【参考方案2】:

代码太多......您应该只发布与问题相关的代码。我的猜测,您只设置视图并且没有对此负责的变量。当您重新加载表格视图时,您会更新颜色并设置默认颜色。 简单的解决方案 - 创建代表每个单元格的模型。该模型知道选择了哪些按钮等。

编辑: 示例

class Model 

    var name: String?
    var isButtonOneSelected = false
    var isButtonTwoSelected = false
    var isButtonThreeSelected = false
    ....


【讨论】:

【参考方案3】:

您可以使用模型或可变字典来表示您的按钮选择。

NSMutableDictionary *buttonSelection = [@@"P_Button" : @"Selected",
                                          @"F_Button" : @"Selected",
                                          @"W_Button" : @"Selected",
                                          @"NA_Button" : @"Selected" mutableCopy];

在您的方法cellForRowAtIndexPath 中。你可以简单地使用这个字典来更新每个单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

        static NSString *STI=@"STI";

        AuditTableViewCell *cell = (AuditTableViewCell *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:STI];

        if (cell == nil)
        
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AuditTableViewCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
            cell.accessoryType=UITableViewCellAccessoryNone;
        

        if ([[buttonSelection objectForKey:@"P_Button"] isEqualToString:@"Selected"]) 
            [cell.passbtn setSelected:YES];
        

        return cell;

除此之外,最好为您的自定义单元格使用委托模式以获得您想要的功能。可以通过以下方式完成。

@protocol CustomCellProtocol <NSObject>

- (void)passButtonSelected:(BOOL)selected forIndexPath:(NSIndexPath *)indexPath;

@end

@interface CustomTableViewCell : UITableViewCell

@property (nonatomic, weak) id<CustomCellProtocol> cellDelegate;

@property (nonatomic) NSIndexPath *indexPath;

@end

在 CustomCell 的 @implementation.m 文件中,单击按钮,执行以下操作

- (void)passButtonSelected 

    [self.cellDelegate passButtonSelected:YES forIndexPath:self.indexPath];

在你里面cellForRowAtIndexPath方法,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

        static NSString *STI=@"STI";

        AuditTableViewCell *cell = (AuditTableViewCell *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:STI];

        if (cell == nil)
        
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AuditTableViewCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
            cell.accessoryType=UITableViewCellAccessoryNone;
        

        cell.indexPath = indexPath;
        cell.cellDelegate = self;            

        if ([[buttonSelection objectForKey:@"P_Button"] isEqualToString:@"Selected"]) 
            [cell.passbtn setSelected:YES];
        

        return cell;

因此,当您单击单元格上的按钮时。您将在tableview.m 文件中收到以下调用。

- (void)passButtonSelected:(BOOL)selected forIndexPath:(NSIndexPath *)indexPath 

    NSMutableDictionary *statusDic = [[self.buttonStatusModelArray objectAtIndex:indexPath.row] mutableCopy];
   [statusDic setObject:(selected ? @"Selected" : @"NonSelected") forKey:@"P_Button"];

    [self.buttonStatusModelArray replaceObjectAtIndex:indexPath.row withObject:statusDic];

如果您在实施时遇到任何问题,请告诉我。随时提出修改建议以使其更好:)

【讨论】:

在customtableviewcell中哪里写buttonSelection字典? @Muju,你知道delegate还是我应该在答案中解释? @Muju,请检查编辑后的答案,让我知道我能做些什么让你更清楚

以上是关于为啥当我在目标 c 中重新加载表视图时选择的值会被取消选择的主要内容,如果未能解决你的问题,请参考以下文章

当我在 iOS 的目标 c 中异步发送请求时,为啥我的数据会损坏?

为啥python脚本返回的值会被shell修改?

为啥我的 UIView 在重新加载后没有响应?

当我从另一个视图控制器调用时,为啥我的表视图为零?

为啥图片加载不出来?

应用程序激活时快速视图重新加载