2014-05-06 51 views
0

我正在使用UICollectionView來產生一個單元格的網格,說總數爲10即0-9。UICollectionView insertItemAtIndexPath不工作

現在,我想單擊其中一個單元格,在網格中插入一個新單元格。

所以我在函數didSelectItemAtIndexPath的內部添加了以下代碼行[_collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:10 inSection:0]]];。所以現在,如果我將indexPathForItem:設置爲10(即最後插入),那麼我會在這一行上得到'Assertion failure'錯誤。如果我設置了'indexPathForItem:'0-9之間的任何內容,那麼我會在這一行上得到'EXC_BAD_ACCESS ...'錯誤。

這是我完整的代碼實現UICollectionView:

- (void)loadView 
{ 
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 


    UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init]; 
    _collectionView=[[UICollectionView alloc] initWithFrame:CGRectMake(0, 97.5,              self.view.frame.size.width, self.view.frame.size.height-67.5) collectionViewLayout:layout]; 
    [_collectionView setDataSource:self]; 
    [_collectionView setDelegate:self]; 

    [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"]; 
    [_collectionView setBackgroundColor:[UIColor whiteColor]]; 

    [self.view addSubview:_collectionView]; 

} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection: (NSInteger)section 
{ 
    return 35; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath]; 

    cell.layer.borderWidth=.5f; 
    cell.layer.borderColor=[UIColor blackColor].CGColor; 

    if(indexPath.item<31) 
    { 
     _dayNumber = [[UILabel alloc] initWithFrame:CGRectMake(30, 30, 15, 15)]; 
     _dayNumber.font = [UIFont systemFontOfSize:12]; 
     _dayNumber.text = [NSString stringWithFormat:@"%ld",(indexPath.item + 1)]; 
     [cell addSubview:_dayNumber]; 
    } 


    return cell; 
} 

- (CGSize)collectionView:(UICollectionView *)collectionView layout: (UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return CGSizeMake(self.view.frame.size.width/7, self.view.frame.size.width/7); 
} 

- (CGFloat)collectionView:(UICollectionView *)collectionView layout: (UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex: (NSInteger)section 
{ 
    return 0.0; 
} 

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section 
{ 
    return 0.0; 
} 

// Layout: Set Edges 
- (UIEdgeInsets)collectionView: 
(UICollectionView *)collectionView layout: (UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
{ 
    return UIEdgeInsetsMake(0,0,0,0); // top, left, bottom, right 
} 

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath: (NSIndexPath *)indexPath 
{ 
    [_collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]]; 
} 

任何幫助嗎?

+0

您是否在插入UICollectionView之前在數組中添加對象? – Arpit

+0

如果你的意思是將一個對象添加到數據數組中,那麼不,我目前沒有數據數組。我在'cellForItemAtIndexPath'中添加靜態文本。 – shrishaster

回答

4

好,

首先讓我們來考慮這種方法,

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection: (NSInteger)section 
{ 
    return 35; // returning constant value means that you can't add or remove cells later 
} 

所以讓我改變這

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection: (NSInteger)section 
{ 
    return self.itemsCount; 
} 

聲明itemsCount財產在你的類接口,這樣

@interface YourClass() 
@property (nonatomic) NSInteger itemsCount; 
@end 

初始化它的loadView或init方法,

_itemsCount = 35; // or whatever you want, initial count 

現在我們可以插入/刪除項目,對不對?當我們調用insertItemAtIndexPaths所有我們需要做的是調用之前正在更新實際數據(例如self.itemsCount ++,[self.myItems ADDOBJECT:的newitem]) 這裏是你的代碼更改

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.itemsCount++; // updating data 
    [_collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]]; 
} 

最後一個重要的事情,在cellForItemAtIndexPath不分配init任何類型的視圖,並添加爲單元格上的子視圖,這個代碼每次創建單元格上的UILabels,如果你想單元格上的自定義視圖(如imageview,按鈕等),你應該子類UICollectionViewCell並在它的init方法中創建這個東西,這裏是它將如何看起來像

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    YourCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath]; 

    cell.layer.borderWidth = 0.5; 
    cell.layer.borderColor = [UIColor blackColor].CGColor; 

    cell.dayNumber.font = [UIFont systemFontOfSize:12]; 
    cell.dayNumber.text = [NSString stringWithFormat:@"%d",(indexPath.row + 1)]; 

    return cell; 
} 

假設你也改變了這一行,

[_collectionView registerClass:[YourCell class] forCellWithReuseIdentifier:@"cellIdentifier"]; 

注意YourCell是UICollectionViewCell的子類,具有財產dayNumber

蘋果大約有收集意見很大guide。我建議閱讀它。 祝你好運。

+0

但是我現在沒有數據源。我只是在'cellForItemAtIndexPath'中設置了靜態文本。那意味着我不能插入一個單元格? – shrishaster

+0

好吧,你能否更新你的問題併發布你已經實現的所有數據源方法(cellForItem,numberOfItems ..)? – Seryozha

+0

爲我的問題添加了代碼。 – shrishaster

相關問題