0

MessageCell adlı özel koleksiyonViewCell oluşturuyorum. Bu mesaj hücresinin üç bileşeni vardır: bir headerLabel, messageContainerView ve footerLabel. sorun olduğunu ben en iyisi nedir vs. belirli eylemlerle görünümüFarklı Koleksiyonlarla Özel KoleksiyonViewCell?

enter image description here

belirli türde bir görüntülemek istediğiniz mesaj (video, işlem, teslimat teyidi, fotoğraf, metin, vb) türüne bağlı olarak Bunu başarmanın yolu? Benim cep alt sınıfta UIView olarak benim konteyner görünümü kurma ve mesajın türüne bağlı olarak denedim, belirli bir subview değerine ayarlayın ama bu çalışmıyor:

- (void)setMessage:(EMKMessage *)message { 

    //Set Message 
    _message = message; 

    //Check Message Type 
    switch (message.type) { 
     case MessageTypeText: 
     default: { 

      //Create Message Content View 
      TextContentView *textContentView = [[TextContentView alloc] initForAutoLayout]; 
      textContentView.frame = CGRectMake(0, 0, 300, 200); 
      [textContentView setText:message.text]; 
      self.messageContainerView = textContentView; 

      break; 
     } 
    } 
} 

Herhangi bir yardım olurdu oldukça memnun olarak.

cevap

0

İhtiyacınız olan tüm hücreleri ayrı ayrı oluşturabilirsiniz.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

size ihtiyaçlarınıza bağlı olarak farklı hücreleri renturn edebilirsiniz. Sadece temsil etmek istediğiniz nesnenin türünü indexPath'dan kontrol edin ve ilgili hücreyi döndürün. Bu hücreler, onlarla etkileşime girmeniz gerekiyorsa veya blok özelliklerini kullanabiliyorsanız delegelere sahip olabilir. gibi bir şey:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == 0) { 
      VideoMessageCell *cell = [tableView.dequeueReusableCellWithIdentifier:@"VideoMessageCell"]; 
      //set the cell properties 
      return cell; 
    } else if (indexPath.row == 1) { 
      AudioMessageCell *cell = [tableView.dequeueReusableCellWithIdentifier:@"AudioMessageCell"]; 
      //set the cell properties 
      return cell; 
    } 
} 

Şimdi senden belirli bir dizin için ihtiyacım var hangi hücrenin türüne karar bilmiyorum ama ihtiyaçlarınıza göre indexPath.row yerini alabilir. Ayrıca, yeniden kullanılabilir tanımlayıcıları uygun şekilde ayarlamayı da unutmayın.

+0

Teşekkürler Jelly. Sadece bir problem var. Bunu gerçekten söylemeliydim, ama şu anda MessageCell sınıfından gelen, gelen mesajları (IncomingMessageCell') ve giden mesajlardan sorumlu bir tane ('OutgoingMessageCell') ele alan iki hücreye sahibim. Bu ikisi arasındaki fark, kısıtlamalar ve konumlandırmadır. Önceden önerdiğiniz şeyi planladım, ancak bu hem IncomingMessageCell hem de OutgoingMessageCell için birçok kopya hücreye neden olacaktı. Bu gerçekten tek yol mu? – KingPolygon

+0

Miras kullansanız bile aynı mantık uygulanabilir, gerçekten önemli değil. CellInheritedClass1' öğesine ihtiyacınız varsa, tanımlayıcıyı içeren bir hücreyi deşifre edin ve bunu kullanın, eğer CellInheritedClass2'ye ihtiyacınız varsa, bu tür bir hücreyi deşarj edin ve kullanın. Sadece onlar için farklı yeniden kullanım tanımlayıcılarınız olduğundan emin olun. – Jelly

+0

Biraz kafamda Jelly. Bir alt sınıf oluşturmalıyım ("VideoMessageCell" iki kez, bir "IncomingMessageCell" ve bir "OutgoingMessageCell" için bir tane) veya bir şekilde bir kez yapmaktan bir şekilde kurtulabilir miyim? Bir örnek yararlı olurdu. – KingPolygon