插座无法连接到重复内容iOS


144

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

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

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


54
您无法将原型单元中的标签连接到UIViewController子类中的IBOutlet-您必须将其连接到UITableviewCell子类中的IBOutlet。
Paulw11年

好,谢谢!:)这样我就明白了:您能解释为什么吗?
Tomblasta 2014年

3
因为您可以有任意数量的单元格,并且只有一个视图控制器,所以哪个单元格的标签应该连接到视图控制器IBOutlet?
Paulw11年

好的,为什么不只在单个视图控制器中将cellForRowAtIndexPath用于单元格文本呢?谢谢!
Tomblasta 2014年

3
因为加载视图控制器时,插座是绑定到对象(例如标签)的,这时没有单元格,所以没有标签要绑定,如果有单元格,您想绑定
哪个对象

Answers:


168

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


9
@Wain能否请您添加更多有关进入这些商店的信息?
Juan Boero

1
Juan Pablo-他的意思是使用自定义表格视图单元格是正常的。您不能在使用单元格的视图内设置约束的出口,而是需要在cellForRowAtIndexPath中执行此操作,例如-customCell.constraint_row_width.constant = 25.0;
Stuart P.

70

通过情节提要提供给您两种类型的表视图单元,它们是“ 动态原型”和“ 静态单元”

在此处输入图片说明

1.动态原型

根据名称,这种类型的单元是动态生成的。它们是通过您的代码而不是情节提要进行控制的。借助表视图的委托和数据源,您可以通过编程方式指定单元格的数量,单元格的高度,单元格的原型。

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

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

在此处输入图片说明

要解决此问题,您需要将原型标签连接到UITableViewCell对象。A 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在我的代码中,我仍然无法更改文本标签,我已将类连接到单元格,使用标识符称为正确的单元格,但仍未更改
jorge saraiva

@jorgesaraiva让我们在聊天室讨论这个chat.stackoverflow.com/rooms/159396/discuss
方明

我不见了!YourCell+100
丹尼尔·斯普林格

在仅仅用代码工作了6个月的项目后,总是有一些新鲜感总是很高兴。
ttorbik

谢谢,我的问题是我将其连接到ViewController而不是单元。
斯特拉

23

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


这是更简单,更快捷的方法,应该成为大家公认的答案imho
Jaime Agudo

5

或者,您不必使用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
朱利安·西尔维斯特里

1

和我在一起,我有一个UIViewcontroller,并且有一个带有自定义单元格的表格视图。我将UILabel的出口映射UItableviewcell到,UIViewController然后得到了错误。


制作自定义单元格类并在此自定义类中实例化iboutlet
Shauket Sheikh

0

正如大多数人指出的那样,子类化 UITableViewCell解决了这个问题。但是之所以不允许这样做,是因为原型单元(UITableViewCell)是由Apple定义的,因此您无法向其添加任何自己的插座。


0

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.