我正在进行tableview多重选择,取消选择。
我有3个表视图(tableview有标签400我需要多个选择和 取消选择 - > alllMumbaiTableview)
我的问题:当我选择多行时,UITableViewCellAccessoryCheckmark
会消失
滚动tableview后。但在这里,我可以看到那些细胞仍在
仅选择状态但不显示UITableViewCellAccessoryCheckmark
。
滚动后我的表格看起来像这样
这是我的代码
@property (nonatomic, strong) NSMutableArray *arrIndexpaths;
UItableview方法 -
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"SimpleTableItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if(tableView.tag == 100)
{
cell.textLabel.text = [typeArray objectAtIndex:indexPath.row];
}
else if (tableView.tag == 300)
{
cell.textLabel.text = [specialityArray objectAtIndex:indexPath.row];
}
else if (tableView.tag == 400)
{
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
}
if ([self.arrIndexpaths containsObject:[NSIndexSet indexSetWithIndex:indexPath.row]])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.textLabel.text = [allMumbaiArray objectAtIndex:indexPath.row];
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView.tag == 100)
{
_typeTextfield.text=[typeArray objectAtIndex:indexPath.row];
_typeTableview.hidden = YES;
}
else if (tableView.tag == 300)
{
_specialityTextield.text=[specialityArray objectAtIndex:indexPath.row];
_specialityTableview.hidden = YES;
}
else if (tableView.tag == 400)
{
UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
[self.arrIndexpaths addObject:[NSIndexSet indexSetWithIndex:indexPath.row]];
}
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView.tag == 400)
{
UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
tableViewCell.accessoryType = UITableViewCellAccessoryNone;
[self.arrIndexpaths removeObject:[NSIndexSet indexSetWithIndex:indexPath.row]];
}
}
我想要的是什么:
1)即使在滚动tableview之后我也想要UITableViewCellAccessoryCheckmark
(但是当我选择一个时,不应该选择其他行。我以前的问题 - > Selecting one UITableViewCell selects the other cell after scrolling)
2)我只需要将所有选择的值都放入单个数组中。
答案 0 :(得分:2)
我想建议使用每个不同的小区标识符。我不知道如何设置tableviews布局,但它看起来tableviewcell队列替换了上面实现的其他单元格。
static NSString *simpleTableIdentifier = @"SimpleTableItem";
if(tableView.tag == 100)
{
simpleTableIdentifier = @"SimpleTableItem";
}
else if (tableView.tag == 300)
{
simpleTableIdentifier = @"SimpleTableItem1";
}
else if (tableView.tag == 400) {
simpleTableIdentifier = @"SimpleTableItem2";
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
更新最终
#import "ViewController.h"
@interface ViewController () <UITableViewDataSource, UITableViewDelegate> {
NSArray *tmpArray;
}
@property(nonatomic, weak) IBOutlet UITableView *tableView1, *tableView2, *tableView3;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
tmpArray = @[[NSNumber numberWithInt:2],[NSNumber numberWithInt:3]];
[self.view bringSubviewToFront:self.tableView1];
[self.view bringSubviewToFront:self.tableView2];
[self.view bringSubviewToFront:self.tableView3];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"SimpleTableItem";
if (self.tableView1 == tableView)
{
simpleTableIdentifier = @"SimpleTableItem";
}
else if (self.tableView2 == tableView)
{
simpleTableIdentifier = @"SimpleTableItem1";
}
else if (self.tableView3 == tableView) {
simpleTableIdentifier = @"SimpleTableItem2";
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
}
if (self.tableView1 == tableView)
{
cell.textLabel.text = @"tableView1";
}
else if (self.tableView2 == tableView)
{
cell.textLabel.text = @"tableView2";
}
else if (self.tableView3 == tableView) {
if ([tmpArray objectAtIndex:0] == [NSNumber numberWithInt:(int)indexPath.row] ||
[tmpArray objectAtIndex:1] == [NSNumber numberWithInt:(int)indexPath.row] ) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.textLabel.text = @"tableView3";
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 70;
}
答案 1 :(得分:0)
有很多可以解决这个问题。
但最简单的方法是不要在cellforrowatindexpath
中重复使用单元格。
每次创建新的单元格实例&amp;我希望你们两个问题都能解决。
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
我希望它适合你,它适合我。
答案 2 :(得分:0)
我通过使用按钮并在选择/取消选择时更改其图像来实现相同的功能,下面是可以帮助您的代码。
cell.btnCheckMark.tag = indexPath.row;
[cell.btnCheckMark addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
NSString *str1 = [[NSString alloc]init];
str1 = [NSString stringWithFormat:@"%d",cell.btnCheckMark.tag];
//str2 = [NSString stringWithFormat:@"%@",cell.lblText.text];
if ([arrSelect containsObject:str1]) {
cell.btnCheckMark.selected=YES;
str2 = [NSString stringWithFormat:@"%@",cell.lblText.text];
}else{
cell.btnCheckMark.selected=NO;
}
- (无效)buttonPressed:(ID)发送方{
UIButton *btn = (UIButton *)sender;
btn.selected=!btn.selected;
str= [NSString stringWithFormat:@"%d",btn.tag];
displayValues = [NSString stringWithFormat:@"%@",[arrName objectAtIndex:[str integerValue]]];
if (btn.selected) {
[arrSelect addObject:[NSString stringWithString:str]];
// NSLog(@"Name: %@",[arrName objectAtIndex:[str integerValue]]);
}
else{
[arrSelect removeObject:[NSString stringWithString:str]];
// NSLog(@"%@",[arrName objectAtIndex:[str integerValue]]);
}
}
答案 3 :(得分:0)
shrikant
我认为这是因为可重复使用的细胞而发生的。
你试试
replce
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
与
UITableViewCell *cell = nil;
我认为这样可以正常工作。
答案 4 :(得分:0)
我正在更新您的代码。
在ViewDidiLoad方法中 -
if (self.arrIndexpaths) {
self.arrIndexpaths = [[NSMutableArray alloc] init];
}
首次更新cellForRowAtIndexPath方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *simpleTableIdentifier = @"SimpleTableItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath];//Update
if(tableView.tag == 100)
{
cell.textLabel.text = [typeArray objectAtIndex:indexPath.row];
}
else if (tableView.tag == 300)
{
cell.textLabel.text = [specialityArray objectAtIndex:indexPath.row];
}
else if (tableView.tag == 400)
{
/* if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
}*///Update
if ([self.arrIndexpaths containsObject:indexPath])//Update
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.textLabel.text = [allMumbaiArray objectAtIndex:indexPath.row];
}
return cell;}
第二次更新DidSelectRowIndexPath方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView.tag == 100)
{
_typeTextfield.text=[typeArray objectAtIndex:indexPath.row];
_typeTableview.hidden = YES;
}
else if (tableView.tag == 300)
{
_specialityTextield.text=[specialityArray objectAtIndex:indexPath.row];
_specialityTableview.hidden = YES;
}
else if (tableView.tag == 400)
{
UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:[tableView indexPathForSelectedRow]];//Update
if ([self.arrIndexpaths containsObject:indexPath])//Update
{
tableViewCell.accessoryType = UITableViewCellAccessoryNone;
[self.arrIndexpaths removeObject:indexPath];
}
else
{
tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
[self.arrIndexpaths addObject:indexPath];
}
}
}
希望上面的代码能为您提供帮助。
答案 5 :(得分:0)
我必须为每张桌子使用不同的标识符。为每个tableview返回单元格,然后它为我工作
更新代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView.tag == 100)
{
static NSString *simpleTableIdentifier = @"SimpleTableItem1";
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
cell.textLabel.text = [typeArray objectAtIndex:indexPath.row];
return cell;
}
else if (tableView.tag == 300)
{
static NSString *simpleTableIdentifier = @"SimpleTableItem2";
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
cell.textLabel.text = [specialityArray objectAtIndex:indexPath.row];
return cell;
}
else
{
static NSString *simpleTableIdentifier = @"SimpleTableItem3";
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
}
if ([self.arrIndexpaths containsObject:[NSIndexSet indexSetWithIndex:indexPath.row]])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.textLabel.text = [allMumbaiArray objectAtIndex:indexPath.row];
return cell;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView.tag == 100)
{
_typeTextfield.text=[typeArray objectAtIndex:indexPath.row];
_typeTableview.hidden = YES;
}
else if (tableView.tag == 300)
{
_specialityTextield.text=[specialityArray objectAtIndex:indexPath.row];
_specialityTableview.hidden = YES;
}
else if (tableView.tag == 400)
{
UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
[self.arrIndexpaths addObject:[NSIndexSet indexSetWithIndex:indexPath.row]];
}
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath: (NSIndexPath *)indexPath
{
if (tableView.tag == 400)
{
UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
tableViewCell.accessoryType = UITableViewCellAccessoryNone;
[self.arrIndexpaths removeObject:[NSIndexSet indexSetWithIndex:indexPath.row]];
}
}