【问题标题】:Custom CollectionViewCell With Different Subviews?具有不同子视图的自定义 UICollectionViewCell?
【发布时间】:2016-07-10 16:38:50
【问题描述】:

我正在创建一个名为 MessageCell 的自定义 collectionViewCell。此消息单元具有三个组件,headerLabelmessageContainerViewfooterLabel。问题是,根据消息的类型(视频、交易、交付确认、照片、文本等),我想显示具有特定操作等的特定类型的视图。

实现此目的的最佳方法是什么?我尝试在单元格子类中将容器视图设置为UIView,并根据消息类型将其设置为特定子视图,但这不起作用:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: ios objective-c uicollectionview uicontainerview uicollectionreusableview


    【解决方案1】:

    您可以单独创建所需的所有单元格。在

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

    您可以根据需要回收不同的单元格。只需在indexPath 处检查您要表示的对象类型并返回相应的单元格。如果您需要与这些单元格交互,或者您可以使用块属性,这些单元格可以有代表。比如:

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

    现在,我不知道您如何确定给定索引需要哪种类型的单元格,但您可以替换 indexPath.row 以满足您的需要。也不要忘记相应地设置可重用的标识符。

    【讨论】:

    • 谢谢果冻。只有一个问题。我真的应该提到这一点,但现在我有两个单元格继承自 MessageCell 类,一个处理传入消息 (IncomingMessageCell),另一个负责传出消息 (OutgoingMessageCell)。两者的区别在于约束和定位。我最初计划了您的建议,但这会导致 IncomingMessageCell 和 OutgoingMessageCell 出现许多重复的单元格。这真的是唯一的方法吗?
    • 好吧,即使您使用继承,也可以应用相同的逻辑,这并不重要。如果您需要CellInheritedClass1,则将具有其标识符的单元格出列并使用它,如果您需要CellInheritedClass2,则将该类型的单元格出列并使用它。只需确保为它们设置不同的重用标识符即可。
    • 我有点困惑果冻。我是否需要创建一个子类(比如两次VideoMessageCell,一次用于IncomingMessageCell,一次用于OutgoingMessageCell,或者我可以以某种方式只创建一次。举个例子会很有用。
    • 谢谢果冻,但我已经知道该怎么做。我的问题与如何设计我的课程有关,这样我就不必设计一个音频单元两次(一个用于传入消息,一个用于传出消息)。
    • 这取决于您的需要。您可以拥有一个带有公共视图的基类,可能还有一些空容器,子类将在其中放置内容。或者您可以让基类中的所有视图和每个子类根据需要修改视图和约束。您的问题没有通用的解决方案。大多数时候我会接受第一个建议。基本上,您需要一种方便地拆分视图的方法。此外,您还可以创建一些自定义视图并在您的单元格中使用它们。这真的取决于您的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多