为啥当我在目标 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]);
如图所示,我选择通过按钮
但是当我重新加载表格时,选择按钮会取消选择
重新加载表格时如何获取选定的值。在此先感谢!
【问题讨论】:
最好保留任何选定值的数组并将其设置在 tableviewcellForRowAtIndex
方法中
@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 中重新加载表视图时选择的值会被取消选择的主要内容,如果未能解决你的问题,请参考以下文章