12

这是我的源代码

- (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;
}

所有方法都不会被断点打断。推文正在加载到日志中,所以我知道其他一切都很好,只是无法识别集合视图。是的,我已经设置了

有人知道发生了什么吗?

4

7 回答 7

48

这不是您的情况,它可能对其他将来到这里遇到数据源方法未调用问题的人有所帮助。它可能正在分配数据源,例如:

collectionView.dataSource = MyDataSource()

这是错误的,因为 dataSource 是一个弱引用,所以它需要由一些强引用存储,以便在创建它之后仍然存在。在 ViewController 中添加了一个私有属性以保持强引用,初始化然后分配它可以解决问题。

于 2015-10-27T07:54:20.940 回答
4

几点建议:

  • UICollectionViewviewDidLoad. _
  • 确保init从其他类调用 create 方法
  • tweetArray的也是空的,所以如果调用了numbers方法,它不会返回任何东西,其他方法也不会被调用
于 2013-10-06T22:03:29.907 回答
3

几件事:

1)在(并且仅在)您的“ init”方法中,为您的@property 使用底层实例变量。那是,

_collectionView = collectionView;
_collectionView.dataSource = self;
_collectionView.delegate = self;

这称为“直接访问”,更多信息可以在这个相关问题中看到

2) 在您的 .h 文件中,确保声明您的对象符合数据源和委托协议。例如

@interface JustinViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource>
于 2013-10-06T03:06:30.923 回答
2

为了快速做到这一点,设置一个属性

//MARK: props
let dataSource = MyDataSource()

并且在

viewDidLoad(){
// your other code 
..
..
collectionView.dataSource = dataSource // it is a strong reference 
}

除了这些其他一般陷阱之外

  • 不返回计数或数据源
  • 不填充数据源
于 2018-06-05T21:35:37.227 回答
1

将 collectionView 添加到视图层次结构中。

在 init 方法中,您设置了属性 (self.collectionView),但没有将 collectionView 添加到视图层次结构中。所以 collectionView 不会调用任何 dataSource 或委托方法。

于 2015-01-12T22:06:59.820 回答
0

我在情节提要中创建了集合视图并链接了数据源和委托,但在 Xcode 8.0 和 Swift 3.0 中没有调用它们。尝试了多种方法,但解决方案是在类声明行中声明委托和数据源:

类 ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { ... }

以前当我们通过故事板链接委托和数据源时,它不是必需的,可能是一个错误:)

于 2016-10-20T01:46:03.153 回答
-1

[collectionView reloadData]在方法结束时调用init。需要告知集合视图填充自身。我假设UICollectionViewController在内部执行此操作,但您似乎没有使用UICollectionViewController(或至少不是以通常的方式)。

于 2013-10-06T03:10:19.860 回答