我在tableList上插入一个Button进行检查并取消选中产品,为此我使用了下面的代码,但是当我滚动我的tableList时,已经选中的框已经取消检查并且它们的位置也在改变
我该如何解决这个问题?
我的代码:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return mainArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"HistoryCell";
UITableViewCell *cell = (UITableViewCell *)[MaintableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
model1 = mainArray[indexPath.row];
newBtn=[UIButton buttonWithType:UIButtonTypeCustom];
[newBtn setFrame:CGRectMake(250,5,30,30)];
[newBtn addTarget:self action:@selector(urSelctor:) forControlEvents:UIControlEventTouchUpInside];
UIImage *btnImage;
if(model1.ischeck){
btnImage = [UIImage imageNamed:@"check.png"];
}else{
btnImage = [UIImage imageNamed:@"uncheck.png"];
}
[newBtn setImage:btnImage forState:UIControlStateNormal];
[cell addSubview:newBtn];
return cell;
}
-(void)urSelctor :(UIButton*)sender{
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:MaintableView];
NSIndexPath *indexPath1 = [MaintableView indexPathForRowAtPoint:buttonPosition];
NSInteger variable = indexPath1.row;
model1 = mainArray[variable];
if (model1.ischeck){
model1.ischeck = NO;
[mainArray replaceObjectAtIndex:variable withObject:model1];
forState:UIControlStateNormal];
}
else{
model1.ischeck = YES;
[mainArray replaceObjectAtIndex:variable withObject:model1];
forState:UIControlStateNormal];
}
[MaintableView reloadData];
}
@end
@interface ModelObject1 : NSObject{
BOOL ischeck;
}
@property(nonatomic) BOOL ischeck;
@end
答案 0 :(得分:0)
试试这个:
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
}
修改reuseIdentifier is nil
然后尝试。
答案 1 :(得分:0)
最好的方法是定义自定义的tableview单元格。
如果您只想对代码进行简单更改,请移除dequeueReusableCellWithIdentifier
调用,然后创建新单元格。这不是最好的主意,但它会使您的代码正常工作。
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
答案 2 :(得分:0)
您可以创建一个UITableViewCell类型的自定义单元格。它会解决你的问题。当你每次在cellForRow中添加新的按钮对象时。它还会消耗更多内存。如果不需要太多,请不要在cellForRow中添加子视图。
参见我在本演示中所做的事情:
答案 3 :(得分:0)
您可以使用此代码:
-(void)btnPressed :(id)sender
{
CGPoint point=[sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *index= [self.tableView indexPathForRowAtPoint:point];
UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:index];
[category manageCell:index.row];
[self.tableView reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationAutomatic];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *const cellIdentifier=@"cell";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell==nil)
{
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier ];
}
UIButton *checkBtn=[cell.contentView viewWithTag:100];
[checkBtn addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];
if([category.indexArray containsObject:[NSNumber numberWithInteger:indexPath.row]])
{
[checkBtn setImage:[UIImage imageNamed:@"check"] forState:UIControlStateNormal];
}
else
{
[checkBtn setImage:[UIImage imageNamed:@"uncheck"] forState:UIControlStateNormal];
}
return cell;
}
-(void)manageCell:(NSInteger)index
{
if(![_indexArray containsObject:[NSNumber numberWithInteger:index]])
{
[_indexArray addObject:[NSNumber numberWithInteger:index]];
}
else
{
[_indexArray removeObject:[NSNumber numberWithInteger:index]];
}
NSLog(@"%@",_indexArray);
}