2013-09-18 4 views
1

У меня есть пара collectionView s в том же представлении и решила позволить одному и тому же объекту обрабатывать обязанности источника данных. У меня проблемы с методом collectionView:numberOfItemsInSection:, когда количество элементов, которые я хочу отображать, различается между ними (что все время, кроме тех случаев, когда оно проверено с помощью фиктивного оператора с одним возвратом). В будущем число будет вытягиваться динамически, но только для отладки я подключаю статические значения.Несколько UICollectionView с одним и тем же источником данных

Метод довольно много идет:

if (cv == self.articlesView) {   
    return 4; 
} else if (cv == self.journalsView) { 
    return 4; 
} else if (cv == self.algorithmsView) { 
    return 6; 
} 
return 10; // this never actually runs 

клетки создаются в очень простой способ в этой точке (я только начинаю на это приложение):

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor grayColor];   
    return cell; 
} 

и я бегу Ниже для каждого из моих collectionViews в viewDidLoad:

[cv registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier]; 

ошибка я получаю EXC_BAD_ACCESS и прикреплен к строке [self.window makeKeyAndVisible]; в делегате приложения.

Если я изменил количество элементов для последних collectionView от 6 до 3 (в основном, сделайте это меньше, чем все остальные), приложение запустится, но теперь все коллекцииViews имеют меньшее количество элементов, а не только последнее (похоже, что в первый раз, когда iOS работает collectionView:numberOfItemsInSection:, он делает это для последней коллекцииView).

Так выглядит, как в первый раз, когда метод запускается, результат как-то прилипает и применяется ко всем остальным, а затем появляется ошибка за пределами. Но я не могу понять, как исправить или найти что-то не так с моим минимальным кодом.

ответ

0

EXC_BAD_ACCESS указывает, что у вас есть ошибка памяти. Во-первых, убедитесь, что вы используете ARC. Затем убедитесь, что вы используете аксессоры, а не напрямую обращаетесь к своим иварам. Наконец, запустите статический анализатор и найдите там ошибки.

При этом я бы рекомендовал подклассифицировать источник данных для каждого представления и использовать переопределения методов для реализации логических различий, вместо того, чтобы иметь единый источник данных для всех из них с условной логикой. Для стоимости нескольких объектов вы получаете более четкое разделение функциональности и, вероятно, более простую отладку вашей ошибки памяти.

1

Исправлена ​​ошибка, в этом случае возникла из-за того, что я не только повторное использование того же объекта для delegate и dataSource, но я использовал тот же UICollectionViewLayout для всех collectionView с. Я применял некоторые настройки к объекту UICollectionViewFlowLayout, и так как я хотел иметь те же настройки для всех представлений, я просто использовал один и тот же объект. Как только я изменил его, чтобы иметь отдельный объект макета для каждого представления, и просто применяйте настройки в цикле для всех них - больше никаких сбоев!

Смежные вопросы