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

时间:2015-08-07 14:31:09

标签: ios objective-c storyboard uicollectionview uicollectionviewcell

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

是否可以在故​​事板中的一个位置定义单元格?

enter image description here

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

2 个答案:

答案 0 :(得分:5)

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

  

首先,创建一个新视图(文件>新建>文件),然后从“用户界面”部分中选择“查看”选项。你选择哪个设备系列并不重要,所以给它一个名字(我叫我的NibCell)。它将在画布中打开 - 第一项工作是删除现有视图,并从对象浏览器中拖动Collection View Cell。

您还将创建UICollectionViewCell类的子类,并将其设置为接口构建器中的xib文件的类。 创建了xib并将元素连接到自定义类之后 - 您需要在其中包含UICollectionView的类中注册它(不要忘记将其导入自定义单元格先上课!

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;

}

通常这就是它的全部内容。 希望这可以帮助!

答案 1 :(得分:0)

我在trick Robert J. Clegg's shoed above上建立了一个很酷/有用的抽象。

我将所有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:)方法使我只需要从视图控制器中一行就可以建立表:

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

对于每个重用标识符,所有表都重用同一笔尖对象(SharedTableCellViews.shared.nib)。 关键是设置一个xib文件中每个NSTableCellView的标识符。

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

这里的所有内容均适用于MacOS / AppKit,但应仅重命名NS-> UI,同样适用于iOS / UIKit。