【问题标题】:Outlets cannot be connected to repeating content iOS插座无法连接到重复内容 iOS
【发布时间】:2014-12-21 02:10:59
【问题描述】:

我刚刚创建了一个应用程序并开始将@IBOutlet's 连接到情节提要。我将它们中的一些连接到具有基本样式的 UITableViewCell 原型单元中的标签。当我连接它时,虽然我在情节提要中收到此错误:

TableViewController 到 UILabel 的 detailText Outlet 无效。插座不能连接到重复的内容。

有人可以帮帮我吗?我已经按照我一直成功的方式进行了设置,但这次它让我遇到了这个错误。

【问题讨论】:

  • 您不能将原型单元格中的标签连接到 UIViewController 子类中的 IBOutlet - 您必须将其连接到 UITableviewCell 子类中的 IBOutlet。
  • 好的,谢谢! :) 所以我明白了:你能解释一下原因吗?
  • 因为您可以拥有任意数量的单元格并且只有一个视图控制器 - 所以应该将哪个单元格的标签连接到视图控制器 IBOutlet?
  • 好的,那么为什么不能在一个视图控制器中只使用 cellForRowAtIndexPath 作为单元格文本呢?谢谢!
  • 因为在加载视图控制器时,出口绑定到对象(例如标签) - 那时没有单元格,所以没有要绑定的标签,如果有单元格,你是哪一个想绑定

标签: ios storyboard


【解决方案1】:

创建一个表格视图单元子类,并将其设置为原型的类。将插座添加到该类并连接它们。现在,当您配置单元时,您可以访问插座。

【讨论】:

  • @Wain 您能否添加有关访问这些网点的更多信息?
  • Juan Pablo - 他的意思是使用自定义表格视图单元格是正常的。您不能在使用单元格的视图内为约束设置出口,而是需要在 cellForRowAtIndexPath 中执行此操作 - customCell.constraint_row_width.constant = 25.0;
【解决方案2】:

通过故事板为您提供两种类型的表格视图单元格,它们是动态原型静态单元格

1.动态原型

从名字上看,这种类型的单元格是动态生成的。它们是通过您的代码控制的,而不是故事板。借助表格视图的委托和数据源,您可以以编程方式指定单元格的数量、单元格的高度、单元格的原型。

当您将一个单元格拖到您的表格视图中时,您就是在声明一个单元格的原型。然后,您可以基于此原型创建任意数量的单元格,并以编程方式通过cellForRow 方法将它们添加到表格视图中。这样做的好处是您只需要定义 1 个原型,而不是创建每个单元格并自己添加所有视图(参见静态单元格)。

因此,在这种情况下,您无法将单元原型上的 UI 元素连接到您的视图控制器。您只会启动一个视图控制器对象,但您可能会启动许多单元格对象并将其添加到表视图中。将单元原型连接到视图控制器是没有意义的,因为您无法通过一个视图控制器连接来控制多个单元。如果你这样做,你会得到一个错误。

要解决此问题,您需要将原型标签连接到 UITableViewCell 对象。 UITableViewCell 也是单元格的原型,您可以根据需要启动任意数量的单元格对象,然后将每个单元格对象连接到从情节提要表格单元格原型生成的视图。

最后,在您的 cellForRow 方法中,从 UITableViewCell 类创建自定义单元格,并使用标签做一些有趣的事情

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2。静态细胞

另一方面,静态单元格确实是通过情节提要配置的。您必须将 UI 元素拖到每个单元格中才能创建它们。您将从情节提要中控制单元格编号、高度等。在这种情况下,您将看到与您从情节提要创建的内容相比,手机中的表格视图完全相同。静态单元格更常用于设置页面,其中单元格变化不大。

要控制静态单元格的 UI 元素,您确实需要将它们直接连接到视图控制器并进行设置。

【讨论】:

  • @FangmingNing 在我的代码中,我仍然无法更改文本标签,我已将类连接到单元格,使用标识符调用正确的单元格,但仍未更改
  • @jorgesaraiva 让我们在聊天室讨论这个问题chat.stackoverflow.com/rooms/159396/discuss
  • 我错过了!你的细胞+100
  • 在一个项目上只用了 6 个月的代码来复习一下总是好的。
  • 谢谢,我的问题是我将它连接到 ViewController 而不是单元格。
【解决方案3】:

如果您使用表格视图来显示设置和其他选项(就像内置的设置应用一样),那么您可以将 表格视图内容 设置为 Static Cells 在属性检查器下。此外,为此,您必须将 Table View 嵌入到 UITableViewController 实例中。

【讨论】:

  • 这更简单快捷,应该是接受的答案恕我直言
【解决方案4】:

或者您不必使用 IBOutlet 来引用视图中的对象。您可以给 tableViewCell 中的 Label 一个 Tag 值,例如将 Tag 设置为 123(这可以通过属性检查器完成) .然后您可以通过

访问标签
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}

【讨论】:

  • 非常简单! +100
【解决方案5】:

我有一个UIViewcontroller,在其中我有一个带有自定义单元格的表格视图。我将我的 UILabel 出口映射到 UItableviewcellUIViewController 然后得到错误。

【讨论】:

  • 制作自定义单元类并在您的自定义类中实例化 iboutlet
【解决方案6】:

正如大多数人指出的那样,subclassing UITableViewCell 解决了这个问题。 但这是不允许的原因,因为原型单元(UITableViewCell)是由 Apple 定义的,您不能向其中添加任何自己的 outlet。

【讨论】:

    【解决方案7】:

    有时 Xcode 无法正确控制电池插座连接。

    不知何故,我当前单元格的标签/按钮连接了另一个单元格 我只是删除那些错误就消失了。

    【讨论】:

      【解决方案8】:

      对于collectionView:

      解决方案:

      请从 viewcontroller 中删除 colllectionviewcell 的 IBoutlet

      。该问题提到您的 IBOutlet 无效。所以删除所有具有多出口(无效)的子类并重新连接。

      The answer is already mentioned in another question for collectionviewcell

      【讨论】:

        【解决方案9】:

        点击模拟器, 导航到窗口并启用设备边框

        【讨论】:

          猜你喜欢
          • 2015-01-24
          • 1970-01-01
          • 2015-10-11
          • 2015-07-12
          • 2018-08-12
          • 2017-06-08
          • 2018-02-04
          • 2021-04-08
          相关资源
          最近更新 更多