从 XIB 加载 AQGridViewCell(不工作)
Posted
技术标签:
【中文标题】从 XIB 加载 AQGridViewCell(不工作)【英文标题】:Load a AQGridViewCell from XIB (not working) 【发布时间】:2011-04-08 01:47:14 【问题描述】:我正在使用AQGridView
类,我正在尝试从 XIB 加载一个单元格。我已经将 XIB 设置为 UITableView
的自定义单元格,但是当我尝试加载单元格时,它只是空白。我想知道是否有更简单的方法来加载 XIB。
AQGridViewCell 需要从 xib 加载单元格
- (AQGridViewCell *) gridView: (AQGridView *) gridView cellForItemAtIndex: (NSUInteger) index
static NSString * CellIdentifier = @"cellID";
gridCell * cell = (gridCell *)[gridView dequeueReusableCellWithIdentifier: CellIdentifier];
if ( cell == nil )
gridCell = [[gridViewCell alloc] initWithFrame: CGRectMake(0,0,_gridView.frame.size.width/2-4,
_gridView.frame.size.height/2-8)
reuseIdentifier:CellIdentifier];
cell = gridCell;
self.gridCell = nil;
cell.title = @"Test Grid Item";
cell.date = @"Apr. 7, 2011";
return ( cell );
【问题讨论】:
【参考方案1】:Here's an article 描述了如何从 nib 加载 AQGridViewCell,并带有示例代码。查看名为“A reusable AQGridViewCell”的部分。
(感谢 pt2ph8 指出contentView
。)
【讨论】:
我很难理解为什么会这样。在 ReusableGridViewCellExampleViewController.h 中有一个插座“gridViewCellContent”,但它似乎没有连接(并且没有任何可用的连接......)但它可以正常工作。您能否指出正确的方向来说明为什么会这样?【参考方案2】:据我了解,我认为它显示为空白,因为显示的是单元格的contentView
。我最终从 IB 加载了我的自定义视图,并在请求单元格时将其添加为单元格 contentView
的子视图。
AQGridView 的开发人员曾在 GitHub 上声称,将来会添加适当的 IB 支持,但该帖子的发布日期为 2010 年 8 月,所以不要屏住呼吸。
【讨论】:
【参考方案3】:这花了我一段时间,但我想出的方法与 jlstrecker 提到的博客文章不同。
-
创建
AQGridViewCell
的子类 - 我们称之为
MyGridViewCell
。
为该单元格创建一个 nib,在 IB 中将其链接起来。
在 IB 中的单元格视图的顶部发布视图。没错,一个观点
在视图的顶部。使尺寸完全相同。
对于该视图
视图顶部(我们称之为view2
),设置tag
属性(可以
在 IB 中完成)到 1。
把你想链接的所有东西放在上面
view2
,随意装饰你的牢房。
在AQGridViewController
的子类中使用以下代码(当然,根据需要更改):
`
- (AQGridViewCell *)gridView:(AQGridView *)aGridView cellForItemAtIndex:(NSUInteger)index
static NSString *CellIdentifier = @"MyGridViewCell";
MyGridViewCell *cell = (MyGridViewCell *)[self.gridView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = (ZZProductGridViewCell *)[[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];
[cell.contentView addSubview:[cell viewWithTag:1]]; //THIS IS THE IMPORTANT PART
return cell;
享受吧!
【讨论】:
【参考方案4】:我不熟悉 AQGridView,但我相信您可以利用 NSBundle 的 Nib 加载功能。 AdvancedTableViewCells sample project 的摘录说明了这个想法:
RootViewController.h
@interface RootViewController : UITableViewController
ApplicationCell *tmpCell;
RootViewController.m
ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
[[NSBundle mainBundle] loadNibNamed:@"IndividualSubviewsBasedApplicationCell" owner:self options:nil];
cell = tmpCell;
self.tmpCell = nil;
在 IndividualSubviewsBasedApplicationCell.xib 中,您必须将 UITableViewCell 的出口设置为 RootViewController 的 tmpCell 属性。然后,作为调用 NSBundle 的 loadNibNamed 方法的副作用,tmpCell 属性通过 Nib 加载机制在 RootViewController 上设置。
【讨论】:
这就是我创建“自定义单元格”的方式。但是,实际加载时单元格是空白的。我现在不知道为什么。 看起来好像您在使用捆绑加载机制加载单元后正在初始化单元。尝试取出你的 gridCell = [[gridViewCell alloc] initWithFrame:... 行。 另外,请确保在加载的gridCell上设置reuseIdentifier,否则每次需要一个单元格时都会产生惩罚。 我已经删除了gridCell = [[gridViewCell alloc] initWithFrame..
,但是运行时它们没有交互,而且有点混乱。
我唯一可以建议的是,您要确保填充 gridCell 的实际对象是 AQGridViewCell 或其子类的实际实例。在您的 Xib 文件中,您将有一个表示单元格的对象,并且您必须指定该单元格对象的实现类是 AQGridViewCell 类型。这是我在不了解您的控制器类的情况下可以提供的唯一其他建议。【参考方案5】:
您可以做的是在子类本身中进行 xib (uiview) 解包/加载(它的 init 方法与 uitableviewcell 不同) 您还可以将任何出口连接到此 xib 并将其整个视图添加为子视图,或者替换 contentview)。
为了让它更快,你可以制作这个 xib 的 uinib 并重用它来节省磁盘 i/o。
【讨论】:
【参考方案6】:使用 IB 正常构建您的单元格,然后在您的 AQGridViewCell 子类中添加
- (void)awakeFromNib
self.contentView.backgroundColor = [UIColor clearColor];
【讨论】:
以上是关于从 XIB 加载 AQGridViewCell(不工作)的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确
从 XIB 加载的 UITableView Sectionheader 有时显示不正确