如何在uicollectionview单元格中使用uibutton动作并获取单元格的内容

时间:2014-03-29 11:03:30

标签: ios iphone objective-c uibutton uicollectionview

经过大量搜索后无法弄清楚我的问题。我是iOS开发的新手,所以如果我错了,请不要介意。 :P:)

我的集合视图单元格中有一个按钮,当按下按钮时,它应该更改其背景图像并获取按下单元格按钮的单元格内容。

我这样做

在我的.h文件中

@interface MyCell  : UICollectionViewCell
@property (nonatomic, strong) UIButton *button;
@end

@interface DetailInvoicing : UIViewController
<。>文件中的

@implementation MyCell
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
    self.button = [UIButton buttonWithType:UIButtonTypeCustom];
    self.button.frame = CGRectMake(175, 1, 50, 30);
    self.button.backgroundColor = [UIColor clearColor];
    [self.button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.button setBackgroundImage:[UIImage imageNamed:@"buy.png"]forState:UIControlStateNormal];
    [self.contentView addSubview:self.button];
}
return self;
}

- (void)buttonClicked:(UIButton *)sender
{
NSLog(@"button clicked!");
self.button.backgroundColor = [UIColor lightGrayColor];
[self.button setTitle:@"Sold" forState:UIControlStateNormal];
[self.button setBackgroundImage:[UIImage imageNamed:nil]forState:UIControlStateNormal];
}
@end
在viewdidload方法中

[self CollectionLoad];

并且CollectionLoad方法是

// Use sqlite query to fetch data and save it in array, then
myCollection.delegate = self;
myCollection.dataSource = self;
[myCollection reloadData];
myCollection.backgroundColor=[UIColor clearColor];
[myCollection registerClass:[MyCell class] forCellWithReuseIdentifier:@"CellID"];

然后

use datasource and delegate methods 

点击所需单元格按钮的按钮BG图像被更改。并且还有一些其他随机单元格按钮背景图像被更改...

这里有什么问题,第二件事是

如何在此按钮上获取单元格的内容....

1 个答案:

答案 0 :(得分:4)

您的问题是重用和数据管理。

首先,您通过从池中将它们出列来重用单元。然后添加一个具有默认配置的新按钮。因此,每次重复使用单元格时,您都会添加一个新按钮(即使已经有一个按钮),您也不会给它任何特殊配置(部分数据管理问题)。

对于数据管理,仅更改按钮的状态是不够的 - 您还需要使用按钮选择所代表的新状态更新数据模型。然后,下次显示该状态时,您可以将其设置为正确的值。

您应采取的一般方法是继承UICollectionViewCell,以便您可以添加按钮(仅一次)。单元子类应该是按钮的目标(而不是控制器)。单元子类还可以有一个@property,它是与之关联的数据模型的一部分,以便在点击按钮时可以更新内容。并且,当设置属性时,单元格可以根据内容自行更新(设置适当的按钮配置)。或者,单元可以使用适当的信息回调到控制器(并且控制器可以在数据源方法中配置按钮)。