在多个集合视图中重用单个 UICollectionViewCell

Reuse single UICollectionViewCell in multiple collection views

我有多个集合视图需要使用相同的原型单元格。现在,我正在复制情节提要中每个集合视图中的原型单元格(如下所示)。这不是很干,并且在对单元格进行故事板更改时会变得很痛苦。

是否可以在情节提要中的一个地方定义单元格?

或者,我尝试仅使用 1 个集合视图,但无法获得单元格堆叠和垂直滚动的 3 列布局,因此我移至 3 个集合视图。

是的,这是可能的。我从不在故事板中设计单元格(UITableViewUICollectionView 单元格)。很有可能,您需要像这里的情况一样重用它们。

To begin with, create a new view (File > New > File) and select the View option from the User Interface section. It doesn’t matter which device family you choose, so give it a name (I’m calling mine NibCell). It will open up in the canvas – the first job is to delete the existing view, and drag in a Collection View Cell from the Object Browser.

您还可以创建 UICollectionViewCell class 的子 class 并将其设置为界面生成器中 xib 文件的 class。 一旦你创建了 xib 并将元素连接到自定义 class - 你需要像这样在你的 class 中注册它,其中有 UICollectionView不要忘记首先将其导入自定义单元格 class!)

UINib *cellNib = [UINib nibWithNibName:@"NibCell" bundle:nil];
[self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cvCell"];

你会像这样使用它:

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

    static NSString *cellIdentifier = @"cvCell";

    CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    //Setup the cell for use 
    return cell;

}

通常就是这样。 希望这可以帮助!

我在 上构建了一个 cool/useful 抽象。

我 cut/pasted 将我所有的 NSTableViewCell 放入一个新的 XIB,我称之为 SharedTableCellViews.xib。为了跟踪其内容,我制作了一个附带的 SharedTableCellViews 结构,如下所示:

import AppKit

/// Models the multiple NSTableCellViews contained within SharedTableCellViews.nib, which can be defined centrally, and reused
/// between multiple `NSTableView`s or `NSOutlineView`s (which are just a subclass thereof)
struct SharedTableCellViews {
    typealias ID = NSUserInterfaceItemIdentifier

    static let shared = SharedTableCellViews()

    static let nibName = "SharedTableCellViews"

    static let textWithIcon   = ID(rawValue: "NameAndIconTableCellView")
    static let numericText    = ID(rawValue: "NumericTextTableCellView")
    static let normalText     = ID(rawValue: "TextTableCellView")
    static let monospacedText = ID(rawValue: "MonoSpacedTextTableCellView")

    static let allIDs = [
        textWithIcon,
        numericText,
        normalText,
        monospacedText,
    ]

    let nib = NSNib(nibNamed: nibName, bundle: nil)

    func register(viewIDs: [NSUserInterfaceItemIdentifier] = allIDs, forUseBy tableView: NSTableView) {
        for viewID in viewsIDs {
            precondition(SharedTableCellViews.allIDs.contains(viewID), "The nib name \(viewID) " +
                "is not one of the viewIDs managed by \(SharedTableCellViews.self).")

            tableView.register(self.nib, forIdentifier: viewID)
        }
    }
}

register(viewIDs:forUseBy:) 方法让我只需要来自我的视图控制器的一行来设置 table:

SharedTableCellViews.shared.register(forUseBy: self.someTableView)

相同的 nib 对象 (SharedTableCellViews.shared.nib) 被所有 table 重复使用,用于每个重用标识符。 关键是在一个xib文件中设置每个NSTableCellView的标识符。

这也可以很好地用作存储我所有 NSUserInterfaceItemIdentifier 的中央命名空间,我可以直接将其与 NSTableView.makeView(withIdentifier:owner:)s 一起使用。

此处的所有内容均适用于 MacOS/AppKit,但应该同样适用于 iOS/UIKit,只需进行几次 NS -> UI 重命名。