'cellForItemAtIndexPath'中的自定义单元初始化导致堆叠单元格堆叠视图

时间:2017-06-16 09:41:04

标签: ios objective-c uicollectionview uicollectionviewcell

我使用这个函数创建一个单元格:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    BOOL isFocusOn = [_userDefault boolForKey:@"mixFocusOn"];

    CDCChannelStrip *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    if (isFocusOn == TRUE) {
        NSNumber *setChan = [self.focusChannels objectAtIndex:indexPath.section];
        NSInteger chanInt = [setChan intValue];
        [cell initData:(chanInt)];
        [self getParameters:(setChan)];

    } else {
        NSInteger chanInt = indexPath.section;
        NSNumber *chanNum = [NSNumber numberWithInt:chanInt]; // doesnt matter
        [cell initData:(chanInt)]; // init
        [self getParameters:(chanNum)]; // params
    }

    [self.mixMonitorView setChannelsStripToType:(cell)];
    cell.clipsToBounds = YES;
    return cell;
}

有问题的func是initData,如下所示:

- (void)initData:(NSInteger)channel {
        self.isBus = false;
        self.isSendChan = false;
        self.recallSafeFade = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"recallSafe"]];
        self.recallSafeFade.y = 80;
        [self.recallSafeFade setUserInteractionEnabled:YES];
        self.recallSafeHead = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"recallSafeHeadamp"]];
        [self.recallSafeHead setUserInteractionEnabled:NO];
        self.recallSafePan = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"recallSafePan"]];
        self.recallSafePan.y = 768 - 141;
        [self.recallSafePan setUserInteractionEnabled:YES];
        self.channelNumber = channel;
        [self setClipsToBounds:NO];
        _background = [[UIView alloc] initWithFrame:CGRectMake(0, 80, 122, 547)];
        [_background setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"singleFader"]]];
        [self addSubview:_background];
        [self addChannelName];
        [self addInput];
        [self addPan];
        [self addOn];
        [self addMeter];
        [self addFader];
}

所以问题就是,我需要调用这个函数来设置我的自定义单元格以查看和运行我需要它的方式。但是,每当我因为状态变化而在集合视图上调用reload时,它会将新视图分层叠在旧视图的顶部(由于重新映射imageview alloc)

那么我如何自动将这个func应用于每个单元格,但每次重新加载单元格时都不会重新应用它?

此处视图调试器中的问题图像:

enter image description here

2 个答案:

答案 0 :(得分:0)

最简单的方法是为单元格或原型单元格创建单独的xib。在那里设计单元格,在cellForItemAtIndexPath中,您只需操作视图并为标签,图像和其他控制器设置值。

答案 1 :(得分:0)

UICollectionViewCell被重复使用。因此,请避免addSubView:(在您的情况下直接或间接:collectionView:cellForRowAtIndexPath:正在调用initData:,而addSubView:正在调用collectionView:cellForItemAtIndexPath:),每次都在UICollectionView。< / p>

您仅使用UICollectionViewCellIBOutlet代码。 所以没有XIB / Storyboard是单元格,没有dequeueReusableCellWithReuseIdentifier:forIndexPath: 根据{{​​1}}的文件,您应该参与其中:

  

如果您为指定的标识符和新单元格注册了一个类   必须创建,此方法通过调用它来初始化单元格   initWithFrame:方法。

因此,在 CDCChannelStrip.m 中,覆盖initWithFrame:并初始化其属性(&#34;始终&#34;可见/已使用)。

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        _myImageViewProperty = [[UIImageView alloc] initWithFrame:someFrame];
        [self addSubview:_myImageViewProperty];
        etc.
    }
    return self;
}

-(void)updateWithChannel:(NSInteger)channel
{
    self.channelNumber = channel;
    self.channelLabelName = @"Something";
    //etc.
}

您还可以使用prepareForReuse来重新启动&#34;细胞为&#34;处女&#34; (例如它就在initWithFrame:之后。

-(void)prepareForReuse
{
    [super prepareForReuse];
    self.channelLabelName = @"";
    self.backgroundColor = [UIColor clearColor]; 
    //etc.
    [self.sometimesThatImageIsShown setHidden:YES];

}