Outlets无法连接到重复内容iOS

时间:2014-10-25 10:37:07

标签: ios storyboard

我刚创建了一个应用程序,并开始将@ IBOutlet连接到故事板。我将其中一些连接到具有基本样式的UITableViewCell原型单元格中的标签。当我连接它虽然我在故事板中得到这个错误:

  

从TableViewController到UILabel的detailText Outlet无效。奥特莱斯无法连接到重复内容。

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

9 个答案:

答案 0 :(得分:159)

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

答案 1 :(得分:47)

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

enter image description here

<强> 1。动态原型

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

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

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

enter image description here

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

enter image description here

最后,在您的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元素,您确实需要将它们直接连接到视图控制器,然后进行设置。

enter image description here

答案 2 :(得分:22)

如果您使用表格视图显示设置和其他选项(例如内置的设置应用),则可以将表格视图内容设置为静态属性检查器下的单元格。此外,为此,您必须将表视图嵌入到UITableViewController实例中。

答案 3 :(得分:4)

或者您不必使用 IBOutlet 来引用视图中的对象。您可以在 tableViewCell 中为标签赋予标签值,例如将标签设置为 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 
}

答案 4 :(得分:1)

有了我,我有一个UIViewcontroller,并且我有一个带有自定义单元格的tableview。我将UILabel的出口映射到UItableviewcellUIViewController然后出错了。

答案 5 :(得分:0)

正如大多数人指出的那样,子类化 UITableViewCell解决了这个问题。 但这之所以不允许,是因为原型单元格( UITableViewCell )由Apple定义,并且您不能在其中添加任何自己的网点。

答案 6 :(得分:0)

有时Xcode无法正确控制电池出口连接。

我当前单元格的标签/按钮以某种方式连接了另一个单元格 我只删除了这些,错误就消失了。

答案 7 :(得分:0)

对于集合视图:

解决方案:

<块引用>

从viewcontroller,请删除colllectionviewcell的IBoutlet

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

The answer is already mentioned in another question for collectionviewcell

答案 8 :(得分:-1)

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