【问题标题】:UITableViewCell from a custom .XIB file doesn't create outlets自定义 .XIB 文件中的 UITableViewCell 不会创建插座
【发布时间】:2012-03-29 07:53:14
【问题描述】:

更新 2:


长话短说,我对此很愚蠢(而且,在我的辩护中,我没有接受过适当的教育)。现在可以了。我的问题与最初的主题有点偏离,但那是因为我不了解我的应用程序中发生了什么。我想用最后一个(也是很小的)查询来结束这个问题:

我的 customCell.xib 中有两个标签。我希望其中一个(cell.label2)有时包含更长的文本段(2-3 行)。我知道让它完全适合的一种方法是设置 autoshrink 属性,但它会缩小到文本,以便它可以放在一行上。我想保留原始文本大小并扩大单元格的高度,使文本跨越多行而不是缩小它。

有没有办法做到这一点?

更新 1:


我根据下面的回复尝试了一些方法,但它们无济于事。我越来越相信我做的事情根本上是错误的,而你们只是想不到它,因为它是如此基本。所以让我们再试一次。我要稍微改一下名字,这样更容易记住。

问题似乎在于我无法为我的 customCell 创建任何IBOutletsIBActions。现在我有 3 个文件应该处理这个问题(DetailedDirectionViewCell.{h,m,xib},但 Interface Builder 不允许我从我的 UITableViewCell 对象中创建属性/出口/引用 - 任何地方。

我没有在此处复制代码,而是提供了一个包含指向我的代码链接的 PasteBin 条目。和以前一样,我删除了不太有趣的方法。如果你愿意,请看一下。 http://pastebin.com/p4eADhKQ

我也有 customCell.{h,m},但这些只是继承自 UITableViewCell 的新 Objective C 类文件。 customCell.xib 只是一个带有两个标签的单元格。


所以我真的有几个问题。

首先,使用自己的 .XIB 文件中包含的自定义 UITableViewCell 以编程方式生成 UITableView。我的 DirectionsViewController 类只是一个带有编程单元的UITableView。点击其中一个单元格需要呈现一个DetailedDirectionsViewController 表(以模态方式),其单元格设计位于DetailedDirectionsViewCell.xib 文件中。问题是,我无法从 nib 文件中为UITableViewCell 创建IBOutlet - 任何地方。拖动文件的所有者图标/插座不提供创建任何东西。经过 5 个小时的挣扎,这意味着我无法呈现我的详细视图。

第二个问题涉及向 DirectionsViewController 添加导航栏,但我们暂时先不管它。

以下是一些您可能会觉得有用的方法:

//inside DirectionsViewController
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)
{
    DetailedDirectionsViewController *vc = [[DetailedDirectionsViewController alloc] initWithStyle:UITableViewStyleGrouped];
    vc.instruction = [turnList objectAtIndexPath:indexPath.row];
    [self.tabBarController presentModalViewController:vc animated:YES];
}

//inside DetailedDirectionsViewController
- (UITableViewCell *) tableView:(UITableView *) cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"directionsCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        [[NSBundle mainBundle] initWIthNibNamed:@"DetailedDirectionsViewCell" owner:nil options:nil];
        cell = self.tableViewCell;
        self.tableViewCell = nil;
    }

    //here I configure the custom cell
    return cell;
}

我认为其余的方法并不重要,因为它们要么按预期工作,要么几乎是默认方法。

总结一下:

DirectionsViewController - 本质上是带有自定义单元格的UITableViewController。没有 .xib 文件 DetailedDirectionsViewController - 有关来自 DirectionsViewController 的条目的详细信息。这里的单元格应该来自一个 .XIB 文件,但这已经被破坏了。 DetailedDirectionsViewCell - 这是自定义单元格。我无法设置它的文件所有者。


【问题讨论】:

  • 您是否在xib的身份检查器中设置了文件所有者的类别?
  • 这是我做不到的。将文件的所有者/新引用出口拖到我的任何类对我没有任何作用。

标签: iphone objective-c ios xcode uitableview


【解决方案1】:

好的.. 您没有从文件所有者创建IBOutlet 连接。看一下屏幕截图。您从 CustomCell 的视图中创建 IBOutlet(带有红色箭头)。

只需按照以下步骤维护您的代码。

1) 转到CustomCell.h 文件。正如你所说的customCell.xib 有两个UILabels(假设label1 & label2)你必须在CustomCell.h 文件中声明属性并创建出口,然后在.m 文件中合成并释放它。请参考我的这个代码屏幕。

2) 现在在CustomCell.xib 中,选择CustomCell 而非文件所有者的视图(文件所有者应仅继承自NSObject 转到身份检查器(标记为红色椭圆)并选择对应的 Customcell 类(用红色矩形标记)。

3) 右键单击​​自定义单元格的视图并连接到标签。并保存它..

4) 在您的 DirectionsViewController.m 中,您有这个 UITableView 的委托方法 cellForRowAtIndexPath。像这样改变它:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *CustomCellIdentifier = @"CustomCell";
EditProjectCustomCell *cell = (EditProjectCustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier]; // typecast to customcell

[cell setSelectionStyle:UITableViewCellSelectionStyleBlue];

if (cell == nil)
{ 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"EditProjectCustomCell" owner:self options:nil];

        for (id oneObject in nib) 
            if ([oneObject isKindOfClass:[EditProjectCustomCell class]])

            cell = (EditProjectCustomCell *)oneObject;

        [cell setSelectionStyle:UITableViewCellSelectionStyleBlue];

}

cell.label1.text=[someArray1 ObjectAtIndexPath: indexPath.row];
cell.label2.text=[someArray2 ObjectAtIndexPath: indexPath.row];

return cell;

}

此委托方法将被调用的次数与您在numberOfRowsInSection DataSource 方法中返回的值一样多。每次 cell.label 都会为空白,您将通过调用此行将数据添加到标签。因此,无需像您在此处的第 79-90 行之间那样每次都创建标签。 http://pastebin.com/Vd4PKjTu

 cell.label1.text=[someArray ObjectAtIndexPath: indexPath.row];

创建自定义单元意味着您自己为UITableViewCell 创建UI(即.xib)、接口和实现(.h、.m 文件),并在您的类(即DirectionsViewController.mcellForRowAtIndexPath 委托方法中采用它们.

【讨论】:

  • 您的两个回答中的一个共同点是您(似乎)有一个DetailedDirectionsViewCell.{h,m} 类 - 我没有。这是一个虚拟类,仅用作自定义单元格的容器,还是我也应该在其中放置一些逻辑?
  • 只需在您在自定义单元格中使用过的 .h 文件中声明您的控制器。请参阅我用屏幕截图更新的答案..
  • 我已经更新了我的原始帖子,提供了关于什么和如何出错的更多信息。希望它有所帮助。
  • 好的..我遇到了问题..我会在几分钟后发布新答案。
  • 我认为我们正在取得进展,但还没有完全达到。我的 DirectionsViewController 中的单元格也是自定义的,但我已经设计了它们并且它们可以工作。我需要customCell.xib 作为DetailedDirectionsViewController 中所有单元格的模板模型,当我单击DirectionsViewController 中的单元格时会出现这种情况。此外,我试图从整个单元格中创建一个属性/插座。定义和综合这两个标签工作正常。
【解决方案2】:

为了加载自定义单元格,我使用了这段代码(测试它并且它正在工作)

static NSString *CustomCellIdentifier = @"CustomCommentIdentifier";
detailedDirectionsViewCell *cell = (DetailedDirectionsViewCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DetailedDirectionsViewCell" owner:self options:nil];
    for (id oneObject in nib)
        {
             if ([oneObject isKindOfClass:[DetailedDirectionsViewCell class]])
             {
                  cell = (DetailedDirectionsViewCell *)oneObject;
             }
        }
}

并确保您将单元格类 nib 文件更改为如下:

  1. 点击文件所有者,将文件类型更改为NSObject(这是为了在连接Outlets时不要混淆。
  2. 删除 nib 文件中的所有视图,然后拖放一个 UITableViewCell 组件。
  3. 将组件的超类更改为 Cell 类,在您的情况下,将单元格从 UITableViewCell 更改为 DetailedDirectionsViewCell
  4. 连接插座。

这应该可行,如果您有任何问题,请告诉我。

【讨论】:

  • 您的两个回答中的一个共同点是您(似乎)有一个DetailedDirectionsViewCell.{h,m} 类 - 我没有。这是一个虚拟类,仅用作自定义单元格的容器,还是我也应该在其中放置一些逻辑?
【解决方案3】:

为了回答您在更新 2 中的最后一个问题,您是否考虑过使用文本字段而不是标签?您应该能够禁用编辑,以便用户无法更改显示的内容。如果您需要将其作为标签,请在标签的属性检查器中,在“标签”下拉菜单下有一个名为“线条”的属性,您可以对其进行调整。我不确定如何以编程方式访问该属性,但快速的 Google 搜索应该可以帮助您。

【讨论】:

  • 顺便说一句,这真的应该是它自己的问题(我猜它已经是)。如果不是,请制作一个并将链接发送给我,我会在那里复制我的答案,这样它就不会阻塞原始问题的主题(关于创建网点等的主题)
  • 整件事几个月前就解决了 - 我在处理文件所有者方面非常愚蠢。
  • 是的,我看到了日期,并认为您现在可能已经继续前进了,但我不喜欢在这里留下一个问题没有答案的想法。这样,如果其他人进行搜索并被引导到这里或其他地方,就会有答案。
【解决方案4】:

就我而言,我对一个单元类有两种不同的看法。当我将插座连接到 .h 文件时,它们仅连接到第一个视图表示,而不是第二个。 因此,要确保您的 outlet 真正连接,请转到 Xcode me 菜单并打开 View -> Utilities -> Show FileConnection 检查器,然后确保您的视图的 outlet 确实连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多