Как изменить данные и макет в представлении коллекции?

У меня есть контроллер представления коллекции. Я хотел бы использовать его повторно. У меня есть два пользовательских макета коллекции, каждый из которых имеет свой собственный источник данных.

Какие шаги и в каком порядке я должен предпринять, чтобы изменить макеты и источник данных?

Мой контроллер 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;

edit: я обнаружил, что self.collectionViewLayout UICollectionViewController является атрибутом только для чтения. Означает ли это, что контроллер не предназначен для повторного использования таким образом? (повторно используется путем переключения его макета и источника данных во время выполнения)? Я полагаю, что он указывает на макет, который использовался для инициализации контроллера, поэтому проблема с представлением trhing для использования старого макета.


person Pétur Ingi Egilsson    schedule 24.04.2014    source источник


Ответы (1)


Я понял это.

Вот код, который позволил повторно использовать контролируемое.

- (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;
        }
}
person Pétur Ingi Egilsson    schedule 24.04.2014