- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Objective-C 和 Xcode 的新手,所以请多多包涵。
我已经尝试解决这个问题很多天了,并限制自己发帖。我读过的关于 UIButtons with Tableviews 的帖子数量很多,我想我太笨了,无法理解为什么这不起作用。
我想实现一个带有多列复选框的 TableView :
1 item1 checkbox checkbox
2 item2 checkbox checkbox
请记住,我目前只尝试实现一列复选框。
我正在使用编码的 UIButton 并将它们的图像设置为我的图像之一:checkedImage.png、unCheckedImage.png
每个项目都有一个字符串 NSArray @""(带有项目标题)和一个 NSMutableArray BOOL(如果选中则为值)。
问题:
选中的按钮@index 1-4 将在滚动表格 View 时丢失其选中的图像。指数 5 似乎保持不变,其他则不然。
调试方法时:-(void)checkboxSelected:(id)sender
似乎拖出了正确的@row(index) 并且 bool 变量似乎是正确的,但图像不是。
我的想法是 UIButton 改变状态,所以我在所有 ControlState 上实现了按钮图像,没有发生任何区别。
代码:
#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
最佳答案
1) 不要制作items
一个字符串数组,使其成为一个自定义对象数组,其中包含要显示的字符串和 BOOL
记住是否被选中的成员变量。
2) 仅在 cellForRowAtIndexPath
期间设置您的图像方法,而不是其他方法,并根据 BOOL
的状态以不同方式执行上面提到的变量。
3) 当所选状态因您的操作方法(或其他)而改变时,它应该只改变 BOOL
状态变量,然后告诉 TableView 重新加载其数据(这将触发 cellForRowAtIndexPath
)。
关于ios - UIButtons 作为 TableView 中的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20338259/
我是一名优秀的程序员,十分优秀!