Методы ввода данных UICollectionView не вызываются, но устанавливаются в init
Вот мой исходный код
- (id)initWithCollectionView:(UICollectionView *)collectionView
{
self = [super init];
if (self)
{
self.collectionView = collectionView;
self.collectionView.dataSource = self;
self.collectionView.delegate = self;
[self.collectionView registerClass:[TWNTweetCell class] forCellWithReuseIdentifier:kCell];
self.collectionViewLayout = self.collectionView.collectionViewLayout;
self.tweetArray = @[];
self.tweetTextArray = @[];
self.twitter = [STTwitterAPI twitterAPIOSWithFirstAccount];
}
return self;
}
#pragma mark - CollectionView
#pragma mark DataSource
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection: (NSInteger)section
{
return [self.tweetArray count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
TWNTweetCell *cell = (TWNTweetCell *)[collectionView dequeueReusableCellWithReuseIdentifier:kCell forIndexPath:indexPath];
NSDictionary *status = [self.tweetArray objectAtIndex:indexPath.row];
NSString *text = [status valueForKey:@"text"];
cell.usernameLabel.text = screenName;
// cell.createdAtLabel.text = dateString;
cell.autoresizingMask = UIViewAutoresizingFlexibleWidth;
UITextView *textView = [self.tweetTextArray objectAtIndex:indexPath.row];
[cell setTweet:text withTweetTextView:textView];
return cell;
}
Все методы не прерываются вообще точками останова. Твиты загружаются в журнал, поэтому я знаю, что все остальное в порядке, а просто не распознает представление коллекции. И да, я установил
Кто-нибудь знает, что происходит?
Ответы
Ответ 1
Это не ваше дело, это может быть полезно для других, которые придут сюда, имея проблему с неотображаемыми методами источника данных. Это может быть назначение источника данных, например:
collectionView.dataSource = MyDataSource()
что неверно, поскольку dataSource является слабым эталоном, поэтому он должен быть сохранен путем сильной ссылки, чтобы быть живым после его создания. Добавлена частная собственность в ViewController, чтобы сохранить сильную ссылку, инициализировать и затем назначить ее, исправляя проблему.
Ответ 2
Несколько вещей:
1) в (и только в) ваш метод "init
", используйте базовую переменную экземпляра для вашего @property. То есть
_collectionView = collectionView;
_collectionView.dataSource = self;
_collectionView.delegate = self;
Это называется "прямой доступ", и больше информации можно увидеть в этом связанном вопросе.
2) в вашем .h файле, убедитесь, что ваш объект соответствует источнику данных и делегирует протоколы. Например.
@interface JustinViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource>
Ответ 3
Несколько предложений:
- Выполняйте все настройки и настройки
UICollectionView
в viewDidLoad
.
- Убедитесь, что вы вызываете метод create
init
из другого класса
- Ваш
tweetArray
также пуст, поэтому, если вызывается число методов items, оно ничего не вернет, а другие методы не будут называться
Ответ 4
Добавьте CollectionView в иерархию представлений.
В методе init вы устанавливаете свойство (self.collectionView), но вы не добавляете collectionView в иерархию представлений. Таким образом, collectionView не будет вызывать метод dataSource или делегата.
Ответ 5
Вызвать [collectionView reloadData]
в конце вашего метода init
. Представление коллекции нужно сказать, чтобы заполнить себя. Я предполагаю, что UICollectionViewController
делает это внутренне, но вы, кажется, не используете UICollectionViewController
(или, по крайней мере, не обычным способом).
Ответ 6
Я создал представление коллекции в раскадровке и связанном источнике данных и делегировании, но они не вызывались в Xcode 8.0 с Swift 3.0. Пробовал несколько вещей, но решение заключалось в том, чтобы объявить делегат и источник данных в строке объявления класса:
класс ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
...
}
Раньше, когда мы связывали делегат и источник данных через раскадровку, это не требовалось, может быть ошибка:)