在多个集合视图中重用单个 UICollectionViewCell
Reuse single UICollectionViewCell in multiple collection views
我有多个集合视图需要使用相同的原型单元格。现在,我正在复制情节提要中每个集合视图中的原型单元格(如下所示)。这不是很干,并且在对单元格进行故事板更改时会变得很痛苦。
是否可以在情节提要中的一个地方定义单元格?
或者,我尝试仅使用 1 个集合视图,但无法获得单元格堆叠和垂直滚动的 3 列布局,因此我移至 3 个集合视图。
是的,这是可能的。我从不在故事板中设计单元格(UITableView
或 UICollectionView
单元格)。很有可能,您需要像这里的情况一样重用它们。
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
重命名。
我有多个集合视图需要使用相同的原型单元格。现在,我正在复制情节提要中每个集合视图中的原型单元格(如下所示)。这不是很干,并且在对单元格进行故事板更改时会变得很痛苦。
是否可以在情节提要中的一个地方定义单元格?
或者,我尝试仅使用 1 个集合视图,但无法获得单元格堆叠和垂直滚动的 3 列布局,因此我移至 3 个集合视图。
是的,这是可能的。我从不在故事板中设计单元格(UITableView
或 UICollectionView
单元格)。很有可能,您需要像这里的情况一样重用它们。
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;
}
通常就是这样。 希望这可以帮助!
我在
我 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
重命名。