我是Objective-C和Xcode的新手,所以请耐心等待。
我试图解决这个问题已经很多天了,并且限制自己不要发帖。我读过UIButtons与Tableview的帖子数量很多,我觉得我太愚蠢了解为什么这不起作用。
我想实现一个包含多列复选框的tableview:
1 item1复选框复选框
2项2复选框复选框
请记住,我目前只尝试实施一列复选框。
我正在使用编码的UIButton并将其图像设置为我的一个图像:checkedImage.png,unCheckedImage.png
每个项目的一个字符串NSArray @“”(带有项目标题)和一个NSMutableArray BOOL(如果选中,则为值)。
问题:
滚动表格视图时,选中的按钮@index 1-4将丢失其选中的图像。指数5似乎保持不变,其他指数则没有那么多。
调试方法时:-(void)checkboxSelected:(id)sender
似乎拖出了正确的@row(索引),bool变量似乎是正确的但是图像没有。
我的想法是UIButton改变了状态,所以我在所有ControlState上实现了buttonimage,没有发生任何差异。
代码:
#import "ViewController.h"
#define sectionCount 1
#define itemSection 0
@interface ViewController ()
{
NSArray *items;
NSMutableArray *itemsChecked;
UITableView *_tableView;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
items = @[@"1", @"2",@"3", @"4",@"5", @"6",@"7", @"8",@"9", @"10",@"11", @"12",@"13", @"14"];
itemsChecked = [[NSMutableArray alloc] init];
for(int i = 0; i < 14; i++)
{
[itemsChecked addObject:[NSNumber numberWithBool:false]];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
_tableView = tableView;
return sectionCount;
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section
{
switch(section)
{
case itemSection:
{
return [items count];
}
default:
return 0;
}
}
-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch (section)
{
case itemSection:
return @"Items";
default:
return @"woot";
}
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"itemCell"];
switch(indexPath.section)
{
case itemSection:
cell.textLabel.text = items[indexPath.row];
break;
default:
cell.textLabel.text=@"Unknown";
}
static NSInteger checkboxTag = 123;
NSInteger x,y;x = 100; y = 10;
UIButton *checkbox = (UIButton *) [cell.contentView viewWithTag:checkboxTag];
if (!checkbox)
{
checkbox = [[UIButton alloc] initWithFrame:(CGRectMake(x,y,20,20))];
checkbox.tag = checkboxTag;
[cell.contentView addSubview:checkbox];
}
[checkbox setImage:[UIImage imageNamed:@"notSelectedButton.png"] forState:UIControlStateNormal];
checkbox.adjustsImageWhenHighlighted = YES;
[checkbox addTarget:self action:@selector(checkboxSelected:) forControlEvents:UIControlEventTouchDown];
return cell;
}
-(NSIndexPath *) GetCellFromTableView: (UITableView *)tableView Sender:(id)sender
{
CGPoint position = [sender convertPoint:CGPointZero toView:tableView];
NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:position];
return indexPath;//[tableView cellForRowAtIndexPath:indexPath];
}
-(void)checkboxSelected:(id)sender
{
NSIndexPath *ip = [self GetCellFromTableView:_tableView Sender:sender];
NSInteger row = ip.row;
bool checked = [[itemsChecked objectAtIndex:row] boolValue];
if (checked)
{
[(UIButton *)sender setSelected:false];
itemsChecked[row] = @NO;
checked = NO;
}
else
{
[(UIButton *)sender setSelected:true];
itemsChecked[row] = @YES;
checked = YES;
}
UIButton* checkbox = sender;
if (checked)
{
[checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateNormal];
[checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateDisabled];
[checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateApplication];
[checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateHighlighted];
[checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateReserved];
[checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateSelected];
}
else
{
//[checkbox setImage:[UIImage imageNamed:@"notSelectedButton.png"] forState:UIControlStateNormal];
}
}
@end
标题
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDataSource>
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView;
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
-(UITableViewCell *) GetCellFromTableView: (UITableView *)tableView Sender:(id)sender;
-(void)checkboxSelected:(id)sender;
@end
答案 0 :(得分:2)
1)不要使items
成为字符串数组,使其成为包含要显示的字符串的自定义对象数组,以及记住是否已选中的BOOL
成员变量或不。
2)仅在cellForRowAtIndexPath
方法中设置图像,而不是在其他方法中设置图像,并根据上述BOOL
变量的状态以不同方式设置图像。
3)当所选状态由于您的操作方法(或其他)而发生变化时,它应该只更改BOOL
状态变量,然后告诉表视图重新加载其数据(这将触发cellForRowAtIndexPath
)。