从 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(不工作)的主要内容,如果未能解决你的问题,请参考以下文章

从 XIB 加载 UIView 大小不正确

从 .xib 加载自定义视图不适合 iPhone 6+

Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确

从 XIB 加载的 UITableView Sectionheader 有时显示不正确

从 Textfield.inputview 加载 xib UIView

从 xib 文件加载的自动调整视图大小