我这里有代码生成包含按钮的单元格列表。
我很确定有一种方法可以让我创建一个按钮对象而不是20,但我不确定如何实现它?
我需要一些关于在哪里制作它的指导,所以我只创建一个按钮对象。
另外,当我只需要1时,我可能会制作20个单元格对象?
我还不完全了解如何充分利用记忆。
我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = @"TimesCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//[cell sizeToFit];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if([cell.contentView viewWithTag:3] != nil){
[[cell.contentView viewWithTag:3] removeFromSuperview];
}
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self
action:@selector(customActionPressed:)
forControlEvents:UIControlEventTouchDown];
[button setTitleEdgeInsets:UIEdgeInsetsMake(-10.0f, 0.0f, 0.0f, 0.0f)];
button.frame = CGRectMake(5, 5, 310, 50);
button.tag = 3;
int rows = [yourDefaultActivities count];
int rowsl = rows - 1;
float r = 1+(((255-1+75)/rowsl)*(indexPath.row));
if(r > 255){
r = 255;
}
float g = 255-(((255-1+75)/rowsl)*(indexPath.row));
if(g < 0){
g = 255-fabsf(g);
}else{
g = 255;
}
float b = 1;
UIColor *thisColor = [UIColor colorWithRed:r/255 green:g/255 blue:b/255 alpha:1];
button.backgroundColor = thisColor;
button.clipsToBounds = YES;
button.layer.cornerRadius = 15;
button.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
[button setTitle:[[yourDefaultActivities objectAtIndex:indexPath.row] objectAtIndex:0] forState:UIControlStateNormal];
[button.titleLabel setTextColor:[UIColor blackColor]];
[button.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:14]];
[cell addSubview:button];
return cell;
}
编辑:我每次创建一个新按钮时都试图删除按钮,但我一定是做错了..
答案 0 :(得分:2)
一个按钮对象不能同时出现在8个单元格中 - 您需要随时在屏幕上显示的单元格和按钮(看起来像8或9)。但是带有按钮的8或9个单元格不应该导致任何内存问题 - 按钮并不昂贵。您发布的代码的问题在于,每次调用cellForRowAtIndexPath时都会添加按钮,滚动时会发生很多情况。由于单元格被重用,因此您不希望向已有单元格的单元格添加按钮。在我看来,最简单的解决方案是在故事板中创建一个自定义单元格,并在那里添加按钮。您仍然可以根据indexPath在代码中设置颜色,以便获得所需的外观。或者,您可以检查单元格(实际上是您应该将其添加到单元格中的cell.contentView,而不是直接添加到单元格)是否具有类UIButton的子视图,并且只有在没有按钮的情况下才添加按钮。
编辑后:
在回答你的评论时,你不需要在故事板中创建圆角按钮,只需在子类单元格中添加一个按钮(自定义类型),然后在代码中修改它的外观。这是我的意思的一个例子。在这个测试应用程序中,我创建了一个自定义单元类(RDCell)并将故事板中单元格的类更改为。我向单元格添加了一个自定义按钮,使用约束对其进行定位和调整大小,并在RDCell.h中为它创建了一个IBOutlet。这是我在表视图控制器中的内容:
#import "TableController.h"
#import "RDCell.h"
@implementation TableController
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 20;
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(RDCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.button.backgroundColor = [UIColor colorWithHue:.15 + (indexPath.row/30.0) saturation:1 brightness:1 alpha:1];
cell.button.layer.cornerRadius = 15;
cell.button.titleLabel.textColor = [UIColor blackColor];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
[cell.button addTarget:self action:@selector(customActionPressed:) forControlEvents:UIControlEventTouchUpInside];
cell.button.tag = indexPath.row;
return cell;
}
-(void)customActionPressed:(UIButton *) sender {
NSLog(@"button pressed in row: %d",sender.tag);
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:sender.tag inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
}
这是结果观点:
我在RDCell的initWithCoder中放了一个日志,它只被调用了12次(任何时候屏幕上最大的单元格数),所以从不超过12个单元格或12个按钮。