在情节提要中,如何制作自定义单元以与多个控制器一起使用?

悬崖W

我正在尝试在正在使用的应用程序中使用情节提要。在该应用程序中,有“列表”和“用户”,每个列表用户都包含其他列表的集合(列表的成员,用户拥有的列表)。因此,我有ListCellUserCell类。目标是使它们在整个应用程序中可重用(即,在我的任何tableview控制器中)。

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

如何在情节提要中创建可在任何视图控制器中重复使用的自定义tableview单元?

这是到目前为止我尝试过的具体操作。

  • 在Controller#1中,添加了一个原型单元,将类设置为我的UITableViewCell子类,设置了重用ID,添加了标签并将其连接到该类的插座。在Controller#2中,添加了一个空的原型单元,将其设置为相同的类,并像以前一样重用ID。当它运行时,当控制器#2中显示单元格时,标签将永远不会出现。在控制器1中工作正常。

  • 在不同的NIB中设计每种电池类型,并连接到适当的电池类别。在情节提要中,添加了一个空的原型单元,并设置其类和重用ID来引用我的单元类。在控制器的viewDidLoad方法中,注册那些NIB文件以获取重用ID。如图所示,两个控制器中的单元都像原型一样是空的。

  • 保留两个控制器中的原型为空并设置类,并将ID重用到我的单元类中。完全用代码构造单元格的UI。单元在所有控制器中都能正常工作。

在第二种情况下,我怀疑原型始终会覆盖NIB,并且如果我杀死原型单元,则可以为重用ID注册我的NIB。但是,那时我将无法设置从单元格到其他框架的序列,这实际上就是使用情节提要的全部要点。

最终,我需要做两件事:在情节提要中连接基于tableview的流,并在视觉上而不是在代码中定义单元格布局。到目前为止,我还看不到如何做到这两个。

BJ荷马

据我了解,您想:

  1. 在IB中设计一个可以在多个情节提要场景中使用的单元。
  2. 根据该单元所在的场景,从该单元配置唯一的情节提要板序列。

不幸的是,目前尚无办法。要了解为什么以前的尝试不起作用,您需要更多地了解情节提要和原型表视图单元如何工作。(如果您不在乎这些其他尝试为何不起作用,请随时离开。除了建议您提交错误外,我没有其他神奇的解决方法。)

从本质上讲,分镜脚本只是.xib文件的集合而已。当您加载一个包含一些原型单元在故事板中的表视图控制器时,将发生以下情况:

  • 每个原型单元实际上都是其自己的嵌入式微型笔尖。因此,当表视图控制器加载完毕时,它将遍历每个原型单元的笔尖和调用-[UITableView registerNib:forCellReuseIdentifier:]
  • 表格视图向控制器询问单元格。
  • 你可能会打电话 -[UITableView dequeueReusableCellWithIdentifier:]
  • 当您请求具有给定重用标识符的单元格时,它会检查其是否已注册笔尖。如果是这样,它将实例化该单元的实例。这由以下步骤组成:

    1. 查看单元格的类别,如单元格的笔尖中所定义。致电[[CellClass alloc] initWithCoder:]
    2. -initWithCoder:方法通过并添加子视图并设置在笔尖中定义的属性。IBOutlet可能也被挂在这里了,尽管我还没有测试过;它可能发生在-awakeFromNib
  • 您可以根据需要配置单元。

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

这很重要单元格类别与特定的视图层次结构不具有一一对应的关系视图层次结构完全取决于在此特定控制器中注册的原型单元中的内容。

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


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

在Controller#1中,添加了一个原型单元,将类设置为我的UITableViewCell子类,设置了重用ID,添加了标签并将它们连接到类的插座。在控制器2中,添加了一个空的原型单元,将其设置为相同的类,并像以前一样重用ID。当它运行时,当控制器2中显示单元格时,标签将永远不会显示。在控制器1中工作正常。

这是预期的。尽管两个单元格具有相同的类,但是传递给Controller#2中的单元格的视图层次结构完全没有子视图。这样您得到了一个空单元格,这正是您在原型中放入的单元格。

在不同的NIB中设计每种电池类型,并连接到适当的电池类别。在情节提要中,添加了一个空的原型单元,并设置其类和重用ID来引用我的单元类。在控制器的viewDidLoad方法中,注册那些NIB文件以获取重用ID。如图所示,两个控制器中的单元都像原型一样是空的。

同样,这是预期的。重用标识符不在情节提要场景或笔尖之间共享,因此所有这些不同的单元格都具有相同的重用标识符这一事实是没有意义的。从tableview返回的单元格将具有与情节提要场景中的原型单元格相匹配的外观。

但是,此解决方案很接近。如您所述,您可以-[UITableView registerNib:forCellReuseIdentifier:]通过编程方式调用,传递UINib包含该单元格的内容,然后您将获得相同的单元格。(这不是因为原型“覆盖”了笔尖;您只是没有将笔尖注册到表格视图中,所以它仍在查看故事板中嵌入的笔尖。)不幸的是,这种方法存在缺陷–没有办法将情节提要片段连接到独立笔尖中的单元。

保留两个控制器中的原型为空并设置类,并将ID重用到我的单元类中。完全用代码构造单元格的UI。单元在所有控制器中都能正常工作。

自然。希望这并不奇怪。


所以,这就是为什么它不起作用的原因。您可以在独立的笔尖中设计单元,并在多个情节提要场景中使用它们。您目前无法将情节提要序列连接到这些单元。希望您在阅读本文的过程中学到了一些东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Phoenix中将自定义视图与多个控制器一起使用

如何将Spring REST Projections与自定义控制器一起使用

无法使用情节提要自定义实例化窗口控制器

与自定义UITabbarController一起使用情节提要

台风使用情节提要与视图控制器初始化程序一起使用

我可以在控制器MVC上获取与数据注释一起使用的自定义错误消息吗?

如何使ng-init与控制器中的多个函数一起使用?

如何将自定义的NuGet提要与Azure函数一起使用?

在情节提要中推送多个视图控制器

Rails:如何制作一个调用自定义控制器方法的按钮?

在情节提要中加载选项卡栏控制器之前,如何初始化自定义启动屏幕?

如何在情节提要中删除导航控制器?

如何回到情节提要中的根视图控制器?

将自定义依赖性解析器与Unity和Web API控制器一起使用时发生错误

如何使用数据触发器停止自定义情节提要?

情节提要中的自定义字体?

如何在SAP UI中的控制器中定义自定义控制器?

如何将UIPagingView与多个视图控制器一起使用

如何从情节提要中绘制的现有视图控制器构建导航控制器?

如何使用xib视图控制器推送情节提要视图控制器

多个情节提要-多个导航控制器

如何在C ++ 11中将std :: max与自定义比较器一起使用?

如何使自定义键盘与Swift一起使用

如何使GridSeachCV与管道中的自定义转换器一起工作?

如何将 Firebase 存储与自定义服务器一起使用?

如何将AWS Cognito与自定义NodeJS服务器一起使用?

如何在sklearn中将GridSearchCV与自定义估算器一起使用?

如何将 lodash sortBy 与自定义订单比较器一起使用

如何使路由器链接与自定义链接组件一起使用?