Ios 如何处理Swift中UITableViewCell中可能存在或可能不存在的元素?

Ios 如何处理Swift中UITableViewCell中可能存在或可能不存在的元素?,ios,swift,uitableview,Ios,Swift,Uitableview,假设我正在编写一个Twitter克隆,用户可以在其中发布消息和照片。我正在UITableView中呈现推文。对于有照片的tweet,我将把这些照片放在UICollectionView中,称之为photoCollectionView,这个UICollectionView是单元格的子视图。问题是,如果推特上没有照片怎么办?如何隐藏photoCollectionView并动态设置单元格高度?到目前为止,我可以想到两种选择: 选项1:利用故事板和自动布局。在我的故事板中,添加photoCollectio

假设我正在编写一个Twitter克隆,用户可以在其中发布消息和照片。我正在UITableView中呈现推文。对于有照片的tweet,我将把这些照片放在UICollectionView中,称之为
photoCollectionView
,这个UICollectionView是单元格的子视图。问题是,如果推特上没有照片怎么办?如何隐藏
photoCollectionView
并动态设置单元格高度?到目前为止,我可以想到两种选择:

选项1:利用故事板和自动布局。在我的故事板中,添加
photoCollectionView
,但将其
height=0
。但是,我必须设置约束,因为这就是我如何使用
tweetTableView.rowHeight=UITableViewAutomaticDimension
的方法。因此,我为
photoCollectionView
设置了顶部、左侧、右侧和高度约束。然后在
TweetCell
类中,我有:

class TweetCell: UITableViewCell {
    @IBOutlet weak var photoCollectionView: UICollectionView!

    var photos: [UIImage]? {
        didSet {
            if let assets = photos {
                photoCollectionView.delegate = self
                photoCollectionView.frame.size.height = <Some number>
            } else {
                photoCollectionView.frame.size.height = 0
            }
        }
    }

    override func prepareForReuse() {
        photoCollectionView.delegate = nil
        photoCollectionView.frame.size.height = 0
    }
}

extension TweetCell: UICollectionViewDelegate, UICollectionViewDataSource {
    ...
}
然后,在我的
TweetTableViewController
中渲染所有tweet,我需要手动设置行高:

override func cellHeightForRowAt (indexPath: IndexPath) -> CGFloat {
    let cell = tweetTableView.cellForRow(at: indexPath) as? TweetCell
    if let photos = cell?.photos {
        return <Some number>
    }

    return 20    // Suppose default height is 20, to display other info
}
override func cellHeightForRowAt(indepath:indepath)->CGFloat{
将cell=tweetTableView.cellForRow(at:indexPath)设为?TweetCell
如果let photos=cell?.photos{
返回
}
返回20//假设默认高度为20,则显示其他信息
}
这两个选项都能满足我的需求,但是有更好的方法吗?这种方式似乎不是很有效:

  • 选项1使用
    prepareforeuse
    ,根据,我应该只重置与内容无关的属性

  • 选项2动态添加UICollectionView,如果用户快速滚动怎么办


  • 选项3:有两个原型单元。一个用于有照片的推文,另一个用于没有照片的推文。根据您在
    cellForRowAt
    中拥有的数据,将适当的单元格出列


    只需给他们不同的标识符,然后您就可以根据标识符将所需的标识符出列

    选项3:有两个原型单元。一个用于有照片的推文,另一个用于没有照片的推文。根据您在
    cellForRowAt
    中拥有的数据,将适当的单元格出列


    只需给他们不同的标识符,然后您就可以根据标识符将所需的标识符出列

    选项3:有两个原型单元。一个是有照片的推文,另一个是没有照片的推文。根据您在
    cellForRowAt
    中的数据将相应的单元格出列。天哪,我还没有尝试过,但我确信您做对了!只需给他们不同的标识符,然后你就可以根据标识符将你想要的那一个排出来。@vacawama,我不知道为什么我没有想到这一点,我在整个应用程序中使用了多种类型的单元格。非常感谢你!如果你把答案贴在下面,我会接受,除非你不在乎声誉。选项3:有两个原型单元。一个是有照片的推文,另一个是没有照片的推文。根据您在
    cellForRowAt
    中的数据将相应的单元格出列。天哪,我还没有尝试过,但我确信您做对了!只需给他们不同的标识符,然后你就可以根据标识符将你想要的那一个排出来。@vacawama,我不知道为什么我没有想到这一点,我在整个应用程序中使用了多种类型的单元格。非常感谢你!如果你把答案贴在下面,我会接受的,除非你不在乎声誉
    override func cellHeightForRowAt (indexPath: IndexPath) -> CGFloat {
        let cell = tweetTableView.cellForRow(at: indexPath) as? TweetCell
        if let photos = cell?.photos {
            return <Some number>
        }
    
        return 20    // Suppose default height is 20, to display other info
    }