我有多个需要使用相同原型单元格的集合视图。现在,我在故事板中复制每个集合视图中的原型单元格(如下所示)。这不是很干,在对单元格进行故事板更改时会变得很痛苦。
是否可以在故事板中的一个位置定义单元格?
或者我尝试只使用1个集合视图,但是我无法获得单元格堆叠和垂直滚动的3列布局,因此我移动到3个集合视图。
答案 0 :(得分:5)
是的,这是可能的。我从未在故事板中设计单元格(UITableView
或UICollectionView
单元格)。有可能,您需要重复使用它们,就像这里的情况一样。
首先,创建一个新视图(文件>新建>文件),然后从“用户界面”部分中选择“查看”选项。你选择哪个设备系列并不重要,所以给它一个名字(我叫我的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。