2014-04-24 60 views
1

我有一個collectionview控制器。我想重複使用它。我有兩個自定義collectionviewlayouts,每個都有自己的數據源。如何更改collectionview中的數據和佈局?

什麼步驟和順序,我可以改變佈局和數據源?

我的CollectionView控制器如下:

- (id)initWithCollectionViewLayout:(UICollectionViewLayout *)layout { 
    self = [super initWithCollectionViewLayout:layout]; 
    if (self) { 
     self.dataSource = [[WeekDataSource alloc] init]; 
    } 
    return self; 
} 
- (void)loadView { 
    [super loadView]; 
    [self setupCollectionView]; 
} 
- (void)setupCollectionView { 
    self.collectionView = [[CalendarView alloc] initWithFrame:self.view.frame collectionViewLayout:self.collectionViewLayout]; 
    self.collectionView.dataSource = self.dataSource; 
    self.collectionView.delegate = self.dataSource; 
    self.collectionView.backgroundColor = [UIColor whiteColor]; 
} 

控制器顯示集合視圖就好了,用從UICollectionViewLayout派生我的自定義佈局。

我有麻煩,正在改變佈局,以及它依賴的數據源。

我試過了,下面,但由於某種原因,collectionView堅持使用舊的collectionViewLayout。

self.dataSource = [[DayDataSource alloc] initWithScheduleNumber:0]; 
self.collectionView.dataSource = self.dataSource; 
self.collectionView.collectionViewLayout = layout; 

編輯:我已經發現,UICollectionViewController的self.collectionViewLayout是一個只讀屬性。這是否意味着控制器不打算以這種方式重用? (通過在運行時切換佈局和數據源來重用)?我認爲它指向的是用於初始化控制器的佈局,因此視圖三角使用舊佈局的問題。

回答

0

我想出了這一個。

這裏是允許控制被重用的代碼。

- (void)switchToViewMode:(NSInteger)viewMode { 
    UICollectionViewLayout *layout; 
    CalendarView *view; 
    CGRect oldFrame; 
     switch (viewMode) { 
      case 0: 
      case 1: 
       layout = [[DayCollectionViewLayout alloc] initWithCoder:nil]; 
       oldFrame = self.collectionView.frame; 
       view = [[CalendarView alloc] initWithFrame:oldFrame collectionViewLayout:layout]; 
       self.dataSource = [[DayDataSource alloc] initWithScheduleNumber:0]; // TODO set correct date 
       view.dataSource = self.dataSource; 
       view.backgroundColor = [UIColor whiteColor]; 
       self.collectionView = view; 
       break; 

      case 2: 
       layout = [[WeekCollectionViewLayout alloc] initWithCoder:nil]; 
       oldFrame = self.collectionView.frame; 
       view = [[CalendarView alloc] initWithFrame:oldFrame collectionViewLayout:layout]; 
       self.dataSource = [[WeekDataSource alloc] init]; 
       view.dataSource = self.dataSource; 
       view.backgroundColor = [UIColor whiteColor]; 
       self.collectionView = view; 
       break; 

      default: 
        @throw [NSException exceptionWithName:NSInternalInconsistencyException 
                reason:@"Unknown view mode selected." userInfo:nil]; 
       break; 
     } 
}