Методы ввода данных 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 { ... }

Раньше, когда мы связывали делегат и источник данных через раскадровку, это не требовалось, может быть ошибка:)