gpt4 book ai didi

ios - UIButtons 作为 TableView 中的复选框

转载 作者:行者123 更新时间:2023-11-28 22:21:15 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com