0

I'm trying to create a week calendar by using uiclloectionview. here is what it would look like when the view come to focus:

original view when I scroll to bottom and scroll back to top. those cells that were disappeared because of scrolling change text. scrolled view

Here is my code:

@interface ViewController ()

@end

@implementation ViewController
@synthesize calendar;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //[self.calendar setCollectionViewLayout:[[CalendarFlowLayout alloc]init]];
    timeline = [NSArray arrayWithObjects:@"8:00", @"9:00",@"10:00",@"11:00",@"12:00",@"13:00",@"14:00",@"15:00",@"16:00",@"17:00",@"18:00",@"19:00",@"20:00",@"21:00",@"22:00",nil];
    weekline=[NSArray arrayWithObjects:@"Mon", @"Tue",@"Wen",@"Thr",@"Fri",@"Sat",@"Sun",nil];
}

- (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 128;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    if (![cell.contentView viewWithTag:2]) {
        UILabel * title;
        UIView *message;
        title =[[UILabel alloc]initWithFrame:CGRectMake(0, 0, cell.frame.size.width, cell.frame.size.height)];
        title.font=[UIFont systemFontOfSize:14.0];
        title.textAlignment=NSTextAlignmentCenter;
        //title.backgroundColor=[UIColor redColor];
        if (indexPath.row%8==0) {
            int time =indexPath.row/8;
            if (time<[timeline count]) {
                title.text =[NSString stringWithFormat:@"%@",[timeline objectAtIndex:time]];
            }
        }else if(indexPath.row>0&&indexPath.row<8){
            if (indexPath.row<[weekline count]+1) {
                title.text =[NSString stringWithFormat:@"%@",[weekline objectAtIndex:indexPath.row-1]];
            }
            [cell.layer setBorderColor:[UIColor blackColor].CGColor];
            [cell.layer setBorderWidth:1.0f];
        }else{
            [cell.layer setBorderColor:[UIColor blackColor].CGColor];
            [cell.layer setBorderWidth:1.0f];
        }
        title.textColor=[UIColor blackColor];
        message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)];
        message.tag = 2;
        message.backgroundColor =[UIColor clearColor];
        [message addSubview:title];

        [cell.contentView addSubview:message];
    }



    return cell;

}
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    CGFloat width =[[UIScreen mainScreen]bounds].size.width/8;

    return CGSizeMake(width, width);
}
-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(0, 0, 0, 0);
}
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
    return 0.0;
}
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
    return 0.0;
}
@end

I just wonder why indexpath keep changing and how to fix this issue? thank you.

Paulw11
  • 108,386
  • 14
  • 159
  • 186
m_____ilk
  • 143
  • 1
  • 15

1 Answers1

5

You only configure the cell if it doesn't have the message UIView (tag 2) - so when cells are reused you are simply returning them as they were configured previously - however there is no guarantee that the cell be reused in the same indexPath as it was previously - in fact you can pretty much guarantee that it won't.

You need to correctly configure your cell every time. This will be much easier if you configure your prototype cell in the storyboard, or if you don't want to do that create a UICollectionViewCell subclass that adds the title and message controls in its init method.

Paulw11
  • 108,386
  • 14
  • 159
  • 186
  • 1
    +1. Btw here is an old post where i explained how to do it properly : http://stackoverflow.com/questions/23801418/uicollectionview-adding-image-to-a-cell/23802296#23802296 – Kujey Jan 26 '15 at 13:15
  • if i create my own subclass of UIcollectionviewcell, will it slove this problem? do i need to change my code? – m_____ilk Jan 26 '15 at 20:20
  • Yes, and yes. Create a subclass that already contains the additional UI elements (you can do this in Storyboard if you are usng it and link it to your class using IBoutlets as you would normally) the your cellForIndexPath becomes simpler. – Paulw11 Jan 26 '15 at 20:43