我有一个自定义UITableViewCell,它有一个名为updateCell的方法。它添加了一个spotView,它只是一个UIView,self.spotView有几个子视图。
问题是当我滚动时,spotView会很好地启动,但是当你滚动时,它会填满这些子视图和不准确的信息。我该如何解决这个问题?
我在自定义的UITableViewCell中尝试过prepareForReuse,并尝试删除了Spotview的子视图,但这并不起作用。
我有点困惑但是我需要让它正常工作。我看到我可以将uilabel设置为nil以备重复使用,这似乎有效,但这些UIViews似乎很常见:
-(void)updateCell:(MenuItem *)item
{
self.spotView =[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 10.0f, 10.0f)];
[self.contentView addSubview:self.spotView];
[self renderHeader:menuItem.header];
[self renderDetail:menuItem.detail];
[self renderMeta:menuItem];
...
}
- (void)renderMeta:(MenuItem *)menuItem{
if([self.spotView.subviews count]>0){
NSLog(@"THERE ARE subviews in spotView in renderMeta for %@", menuItem.header);
}else{
NSLog(@"NO subviews in spotView in renderMeta for %@", menuItem.header);
}
for (UIView* view in [self.spotView subviews])
{
NSLog(@"!!!about to remove subviews here!!!");
[view removeFromSuperview]; // <- not working
}
if([menuItem hasInstoreImage] || [menuItem hasTastingNotes]){
if([menuItem hasInstoreImage]){
UIView *instoreImageDot=[self circleWithColor:[UIColor redColor] radius:4];
NSLog(@"adding instoreImageDot in renderMeta");
[self.spotView addSubview:instoreImageDot];
}else{
NSLog(@"no instoreImageDot in renderMeta");
}
玩弄这个,我发现尝试操纵自定义UITableViewCell中的视图是一个很大的不可预测的问题。我在代码中执行所有自定义UITableViewCell,因为我将在内部向公司分发Cocoapod。 DID的工作原理是在ViewController中操作单元格,如:
// Does not work on iOS below 6.0
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if([cell isKindOfClass:[MenuItemCell class]]){
NSLog(@"A MenuItem Class");
MenuItemCell *miCell=(MenuItemCell *)cell;
[miCell.spotView removeFromSuperview];
}
}
调用updateCell的位置/方式(稍微缩写为某些代码被取出):
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
[self.menuTV registerClass:[MenuItemCell class]forCellReuseIdentifier:@"MenuItemCell"];
static NSString *MenuItemCellIdentifier=@"MenuItemCell";
id dic=self.menu.listItems[indexPath.row];
if([dic isKindOfClass:[EMBERSMenuItem class]]){
//MenuItemCell *cell = [self.menuTV dequeueReusableCellWithIdentifier:MenuItemCellIdentifier];
MenuItemCell *cell = [self.menuTV dequeueReusableCellWithIdentifier:MenuItemCellIdentifier forIndexPath:indexPath];
//MenuItem *menuItem=(MenuItem *)dic;
MenuItem *menuItem=(MenuItem *)dic;
cell.menuItem=menuItem; // <- probably shouldn't have this
[cell updateCell:menuItem];
}else{
答案 0 :(得分:1)
您应该在单元格的init
方法中添加您的单元格中的子视图。否则,如果每次渲染单元格时添加子视图,则单元格将在渲染发生时结束具有尽可能多的子视图。
举个例子:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
[self.contentView addSubview:mySubview];
}
}
然后您可以使用配置方法来注入您的单元格数据:
- (void)configureCellWithData:(id)data {
self.mySubview.setText(data.text);
}