11392


現在`CollectionView`に0〜299までの数字を持ったセルがあり、1という数字が表示されているセルの横にラインを引いたのですが、  
下にスクロールしていくと関係のない107や222といった数字のセルにラインが引かれて表示されてしまいます。何度も何度もスクロールをしていくとどんどんラインが増殖していきます。`cellForItemAtIndexPath`におけるセルの再利用方法に問題があるのでしょうか？  
また、`cellForItemAtIndexPath`内で毎回`BoundaryLineSide`のインスタンスを生成していることが原因かと思い`ViewDidLoad`で一回だけ生成してラインを描画させるようにしたのですが、これでも1とは関係のない数字のセルにラインが引かれました。  
下記のコードのどこに問題があるのでしょうか？  
どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。

[code]

    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
    {
        return 1;
    }
    
    - (NSInteger)collectionView:(UICollectionView *)collectionView
         numberOfItemsInSection:(NSInteger)section
    {
        return 300;
    }
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        NumberCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"
                                                                                    forIndexPath:indexPath];
        cell.number.text = [NSString stringWithFormat:@"%ld", (long)indexPath.row];
    
        if ([cell.number.text isEqual: @"1"]) {
            BoundaryLineSide *boundarySide = [[BoundaryLineSide alloc] initWithFrame:cell.bounds];
            [cell addSubview:boundarySide];
        }
    
        return cell;
    }
    
    
    
    @implementation BoundaryLineSide
    
    - (id)initWithFrame:(CGRect)frame {
        if (self = [super initWithFrame:frame]) {
            self.backgroundColor = [UIColor clearColor];
        }
        return self;
    }
    
    - (void)drawRect:(CGRect)rect
    {
        CGRect bounds_ = rect;
        CALayer *border = [CALayer layer];
        border.frame = CGRectMake(0, 0.0f, 2.0f, bounds_.size.height);
        border.backgroundColor = [UIColor blueColor].CGColor;
        [self.layer addSublayer:border];
    }
    
[/code]


CC BY-SA 3.0
2015-06-16T02:32:08.140
11389
2015-06-16T08:56:16.673
2015-06-16T02:42:28.290
5210
5210
question
ios objective-c uicollectionview
CollectionViewをスクロールすると表示が崩れる

[code]

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        NumberCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"
                                                                          forIndexPath:indexPath];
        cell.number.text = [NSString stringWithFormat:@"%ld", (long)indexPath.row];
    
        if ([cell.number.text isEqual: @"1"]) {
            BoundaryLineSide *boundarySide = [[BoundaryLineSide alloc] initWithFrame:cell.bounds];
            [cell addSubview:boundarySide];
    
[/code]

いちど`addSubview:`したら、そのセルが再利用されたときにも、`boundarySide`は、セルに貼り付けられたままです。セルのテキストが`"1"`ではなく、かつセルの`subviews`に`boundarySide`が含まれているとしたら、`boundarySide`を`removeFromSuperview`しなければいけません。  
（私なら、`addSubview:`と`removeFromSuperview`をくり返すのは、ハードウェアにとってもめんどくさいことなので、セルには固定でラインを貼り付けたままにしておいて、ラインの`hidden`属性をコントロールすることを考えます。）

[code]

        }
    
        return cell;
    }
    
[/code]


CC BY-SA 3.0
2015-06-16T03:17:59.313
11392
2015-06-16T08:56:16.673
2015-06-16T08:56:16.673
5519
7362
11389
answer