-2

I am new in iOS and I am facing problem in custom table view. I am using custom table view cell

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]);
        }
    }

}

As in the Image I select Pass button

enter image description here

But when I reload the table selected button get unselect

enter image description here

how can I get the selected value when I reload the table.Thanks in Advance!

Himanshu Moradiya
  • 4,769
  • 4
  • 25
  • 49
Muju
  • 884
  • 20
  • 54
  • It's better to keep any array of selected values and set it inside tableview `cellForRowAtIndex` method accordingly – KrishnaCA Jan 07 '17 at 10:44
  • @KrishnaCA How to do that can you please share code.Its a custom table view. – Muju Jan 07 '17 at 10:48
  • So much code, think about a redesign of your tableview! It's weird to read the code. First of all if you want to set values in a tableView you should do it in the cellForRowAtIndexPath method. Think about one Array with objects inside. So if you click a button in the cell, you can get the indexPath of the selected row and get the object which is displayed in the cell over that way. Then you can change the state of the object and your tableview will not loose the state which you set before... – Gulliva Jan 07 '17 at 10:51
  • @Muju, please check the edited answer and let me know what I can do to make it more clear for you – KrishnaCA Jan 07 '17 at 12:41
  • do you know about model class – aafat Jan 10 '17 at 10:20
  • @VinodKumar No not exectly. – Muju Jan 10 '17 at 10:21
  • @Muju can you provide whole code . my skype vinod_choudhary – aafat Jan 10 '17 at 10:39
  • @VinodKumar I will send you request to skype. – Muju Jan 10 '17 at 10:41
  • @VinodKumar Send you request please check. – Muju Jan 10 '17 at 10:42
  • @Muju please tell me your id – aafat Jan 10 '17 at 10:45
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/132778/discussion-between-muju-and-vinod-kumar). – Muju Jan 10 '17 at 10:46

3 Answers3

1

To much code.... You should post only code related to the problem. My guess, you set the view only and don't have variable responsible for this. When you reload table view you update the color and setup the default color. Simple solution - create Model that represents each cell. This model knows which buttons are selected etc.

edited: Example

class Model {

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

}
Axel
  • 768
  • 6
  • 20
1

In ios table view reuse the cell for every row so it does happen. You use model class for manage selection . I have add selectors on button on cell .And also example of reload table view. Please check below code.

//
//  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
aafat
  • 148
  • 2
  • 19
0

You can either have a model or a mutable dictionary to represent selection of your buttons.

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

Inside your method cellForRowAtIndexPath. You can simply use this dictionary for each cell to update:

- (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;
}

Apart from this, it's better to have use delegate pattern for your custom cell to get the functionality you want. It can be done in the following way.

@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

In your @implementation or .m file of CustomCell, on click of button, do the following

- (void)passButtonSelected {

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

Inside you cellForRowAtIndexPath method,

- (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;
}

So, when you click button on your cell. You will get the following call in your tableview.m file.

- (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];
}

If you have any problems in implementing this, please let me know. Feel free to suggest edits to make this better :)

KrishnaCA
  • 5,615
  • 1
  • 21
  • 31