2013-10-06 76 views
10

這裏被設置爲我的源代碼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

你叫正確的init方法?你有沒有在那裏設置一個斷點?順便說一句,你的tweetArray也是空的。 – Tim

回答

2

有兩件事情:

1)(且僅在)你的 「init」 的方法,使用底層的實例變量爲您@property。也就是說,

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

這就是所謂的 「直接接入」,and more information can be seen in this related question

2)在您的.h文件中,確保聲明您的對象符合數據源&委託協議。例如。

@interface JustinViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource> 
+0

顯式聲明協議在運行時不會有太大變化。 –

+0

我要試試這個,我會盡快回復您 –

0

呼叫[collectionView reloadData]init方法結束。收集視圖需要被告知自己填充。我假設UICollectionViewController在內部執行此操作,但您似乎沒有使用UICollectionViewController(或至少不是以常規方式)。

+1

這是不正確的,您不需要爲初始加載調用reloadData。當設置委託和數據源時,這是當方法被調用時。 – Tim

+1

@Tim Yep,你說的沒錯。 –

2

幾點建議:

  • 貴公司的所有UICollectionView設置和配置在viewDidLoad
  • 確保您打電話從其他類中創建init方法
  • tweetArray也是空的,所以如果項目方法的數量被調用,它會返回任何結果和其他方法將不會被調用
+0

抱歉,我的錯,我沒有顯示我的所有代碼,但tweet數組已填充。 –

1

將collectionView添加到視圖層次結構中。

在init方法中,您設置屬性(self.collectionView),但不會將collectionView添加到視圖層次結構中。所以collectionView將不會調用任何數據源或委託方法。

29

它不是你的情況,它可能會有助於其他人誰來這裏有數據源方法沒有被調用的問題。它可以被分配數據源,如:

collectionView.dataSource = MyDataSource() 

這是錯誤的,因爲數據源是一個弱引用,因此它需要通過一些有力的參考存儲是創建後還活着。在ViewController中添加一個私有屬性以保持強引用,初始化並分配它以修復問題。

+0

非常感謝你 –

+0

這是一個很好的觀點。謝謝。 –

0

我在故事板和鏈接的數據源和委託中創建了集合視圖,但它們沒有在Swift 3.0的Xcode 8.0中調用。嘗試了多種事情,但解決方案是在類聲明行中聲明委託和數據源:

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

以前,當我們通過它不是必需的故事板鏈接委託和數據源,可能是一個錯誤:)

相關問題