objective-c - 在 Storyboard中,如何制作用于多个 Controller 的自定义单元格?

标签 objective-c ios uitableview storyboard

我正在尝试在我正在开发的应用程序中使用 Storyboard。在应用程序中有 列表 用户 每个都包含另一个的集合(列表的成员,用户拥有的列表)。因此,相应地,我有 ListCellUserCell类。目标是让它们在整个应用程序中(即,在我的任何 tableview Controller 中)可重复使用。

这就是我遇到问题的地方。

如何在 Storyboard中创建可以在任何 View Controller 中重复使用的自定义 tableview 单元格?

以下是我迄今为止尝试过的具体事情。

  • 在 Controller #1 中,添加了一个原型(prototype)单元,将类设置为我的 UITableViewCell子类,设置重用 ID,添加标签并将它们连接到类的 socket 。在 Controller #2 中,添加了一个空的原型(prototype)单元格,将其设置为与以前相同的类并重用 id。当它运行时,当单元格显示在 Controller #2 中时,标签永远不会出现。在 Controller #1 中工作正常。
  • 在不同的 NIB 中设计每种细胞类型并连接到适当的细胞类别。在 Storyboard中,添加了一个空的原型(prototype)单元格并设置其类并重用 id 来引用我的单元格类。在 Controller 的 viewDidLoad 中方法,将这些 NIB 文件注册为重用 ID。显示时,两个 Controller 中的单元格都像原型(prototype)一样是空的。
  • 将两个 Controller 中的原型(prototype)保持为空并设置类并将 id 重用于我的单元类。完全在代码中构建单元格的 UI。单元格在所有 Controller 中都能完美运行。

  • 在第二种情况下,我怀疑原型(prototype)总是覆盖 NIB,如果我杀死了原型(prototype)单元,则将我的 NIB 注册为重用 ID 会起作用。但是我将无法设置从单元格到其他帧的转场,这才是使用 Storyboard的真正意义所在。

    归根结底,我想要两件事:在 Storyboard中连接基于 tableview 的流,并以视觉方式而不是在代码中定义单元格布局。到目前为止,我不知道如何获得这两个。

    最佳答案

    据我了解,您想要:

  • 在 IB 中设计一个可用于多个 Storyboard场景的单元格。
  • 根据单元格所在的场景,从该单元格配置独特的 Storyboard转场。

  • 不幸的是,目前没有办法做到这一点。要了解为什么您之前的尝试无效,您需要更多地了解 Storyboard和原型(prototype)表 View 单元格的工作原理。 (如果您不关心为什么这些其他尝试不起作用,请随时离开。除了建议您提交错误之外,我没有给您任何神奇的解决方法。)

    从本质上讲, Storyboard只不过是 .xib 文件的集合。当您从 Storyboard加载具有一些原型(prototype)单元格的表 View Controller 时,会发生以下情况:
  • 每个原型(prototype)单元实际上是它自己的嵌入式迷你 Nib 。因此,当表 View Controller 加载时,它会遍历每个原型(prototype)单元格的 Nib 并调用 -[UITableView registerNib:forCellReuseIdentifier:]。 .
  • 表格 View 向 Controller 询问单元格。
  • 您可能会拨打 -[UITableView dequeueReusableCellWithIdentifier:]
  • 当您请求具有给定重用标识符的单元格时,它会检查它是否已注册 Nib 。如果是,它会实例化该单元格的一个实例。这由以下步骤组成:
  • 查看单元格的类,如单元格的 Nib 中所定义。调用 [[CellClass alloc] initWithCoder:] .
  • -initWithCoder:方法遍历并添加 subview 并设置在 Nib 中定义的属性。 ( IBOutlet s 可能也被连接到这里,虽然我没有测试过;它可能发生在 -awakeFromNib 中)
  • 您可以根据需要配置您的单元。

  • 这里要注意的重要一点是,单元格的类别和单元格的视觉外观之间存在区别。您可以创建同一类的两个单独的原型(prototype)单元格,但它们的 subview 布局完全不同。其实如果你使用默认的UITableViewCell样式,这正是正在发生的事情。例如,“默认”样式和“字幕”样式都由相同的 UITableViewCell 表示。类。

    这很重要 : 类(class)单元格与特定的 没有一对一的相关性。查看层次结构 . View 层次完全由注册到这个特定 Controller 的原型(prototype)单元中的内容决定。

    另请注意,细胞的重用标识符未在某些全局细胞药房中注册。重用标识符仅在单个 UITableView 的上下文中使用实例。

    有了这些信息,让我们看看在您的上述尝试中发生了什么。

    In Controller #1, added a prototype cell, set the class to my UITableViewCell subclass, set the reuse id, added the labels and wired them to the class's outlets. In Controller #2, added an empty prototype cell, set it to the same class and reuse id as before. When it runs, the labels never appear when the cells are shown in Controller #2. Works fine in Controller #1.



    这是预期的。虽然两个单元格具有相同的类,但传递给 Controller ​​ #2 中单元格的 View 层次结构完全没有 subview 。所以你得到了一个空单元格,这正是你放入原型(prototype)中的内容。

    Designed each cell type in a different NIB and wired up to the appropriate cell class. In storyboard, added an empty prototype cell and set its class and reuse id to refer to my cell class. In controllers' viewDidLoad methods, registered those NIB files for the reuse id. When shown, cells in both controllers were empty like the prototype.



    再次,这是意料之中的。重用标识符在 Storyboard场景或 Nib 之间不共享,因此所有这些不同的单元格具有相同的重用标识符这一事实毫无意义。您从 tableview 返回的单元格的外观将与 Storyboard场景中的原型(prototype)单元格相匹配。

    不过,这个解决方案很接近。正如您所指出的,您可以通过编程方式调用 -[UITableView registerNib:forCellReuseIdentifier:] ,通过 UINib包含单元格,你会得到同一个单元格。 (这不是因为原型(prototype)“覆盖”了 Nib ;您只是没有在 tableview 中注册 Nib ,所以它仍在查看嵌入在 Storyboard中的 Nib 。)不幸的是,这种方法有一个缺陷——无法将 Storyboard segue 连接到独立 Nib 中的单元格。

    Kept prototypes in both controllers empty and set class and reuse id to my cell class. Constructed the cells' UI entirely in code. Cells work perfectly in all controllers.



    自然。希望这并不奇怪。

    所以,这就是它不起作用的原因。您可以在独立的 Nib 中设计单元格并在多个 Storyboard场景中使用它们;您目前无法将 Storyboard segue 连接到这些单元格。不过,希望您在阅读本文的过程中学到了一些东西。

    关于objective-c - 在 Storyboard中,如何制作用于多个 Controller 的自定义单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245969/

    相关文章:

    objective-c - 带有可见控件的透明 NSWindow

    ios - 返回 UISlider 方法的 INT 的正确方法是什么?

    ios - Swift 3 tableView 不在 reloadData() 上更新

    ios - 如何找到图像的高度和宽度并适合具有宽高比的tableviewcell?

    ios - 如何计算 NSString 中有多少字符直到分号

    ios - Objective C 动画我想在屏幕上移动动画

    iOS UIImage 转换为固定内存大小

    iOS Swift 3 Framework - 在 Storyboard 中无法访问

    ios - 创建 AVPlayerLayer 会导致模拟器崩溃

    ios - UiTableView 以编程方式按部分组织项目