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

166
我刚创建了一个应用程序,并开始将@IBOutlet连接到storyboard。我正在将一些连接到UITableViewCell原型单元格中的标签(基本样式)。但是,当我连接它时,Storyboard会出现以下错误:

从TableViewController到UILabel的detailText Outlet无效,不能将Outlet连接到重复内容。

有人可以帮助我吗?虽然我已经按照我通常成功设置的方式设置了它,但这次却出现了这个错误。

60
在原型单元格中,无法将标签连接到UIViewController子类中的IBOutlet,您必须将其连接到UITableviewCell子类中的IBOutlet。 - Paulw11
好的,谢谢! :) 那么只是为了让我理解:你能解释一下为什么吗? - Tomblasta
4
因为你可以有任意数量的单元格,但只能有一个视图控制器 - 因此,应该将哪个单元格的标签连接到视图控制器的IBOutlet? - Paulw11
好的,那么为什么你不能在一个单一的视图控制器中使用cellForRowAtIndexPath来设置单元格文本呢?谢谢! - Tomblasta
3
因为当视图控制器被加载时,插座会绑定到对象(如标签)- 在那时还没有单元格,因此没有标签可以绑定,即使有单元格,你想绑定哪一个? - Paulw11
请检查您的“目标”(ViewController、Cell等)是否存在任何警告的outlets/actions。 - onmyway133
9个回答

181

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


9
@Wain,请您增加有关如何访问这些插座的更多信息,但不要改变原意,尽量使语言简单易懂。 - Juan Boero
1
Juan Pablo - 他的意思是使用自定义表视图单元格很正常。您无法在使用单元格的视图中设置约束的输出口,而是需要在例如cellForRowAtIndexPath中执行此操作 - customCell.constraint_row_width.constant = 25.0; - Stu P.

79

从storyboard中提供给你两种类型的表视图单元:动态原型和静态单元格。

enter image description here

1. 动态原型

从名称上看,这种类型的单元是动态生成的。它们由代码控制,而不是由storyboard控制。通过table view的delegate和data source的帮助,你可以编程指定单元格数量、单元格高度、单元格原型等。

当你将一个单元格拖到你的表视图中时,你正在声明一组单元格的原型。然后你可以根据这个原型创建任意数量的单元格,并通过cellForRow方法以编程方式将它们添加到表视图中。这样做的优点是,你只需要定义一个原型,而不是手动创建每个单元格并添加所有视图(请参见静态单元格)。

因此,在这种情况下,你不能将单元格原型上的UI元素连接到你的视图控制器上。你只有一个视图控制器对象初始化,但你可能会初始化许多单元格对象并将它们添加到你的表视图中。将单元格原型连接到视图控制器没有意义,因为你无法使用一个视图控制器连接来控制多个单元格。而且如果这样做,你会收到一个错误提示。

enter image description here

要解决这个问题,你需要将原型标签连接到一个UITableViewCell对象上。 UITableViewCell也是单元的原型,你可以初始化任意数量的单元对象,每个单元对象都与从storyboard表格单元格原型生成的视图相连。

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

输入图像描述


@FangmingNing 在我的代码中,我仍然无法更改文本标签。我已经将类连接到单元格,并使用标识符调用了正确的单元格,但仍然没有更改。 - jorge saraiva
@jorgesaraiva 让我们在聊天室 https://chat.stackoverflow.com/rooms/159396/discuss 中讨论这个问题。 - Fangming
我缺少了 as! YourCell+100 - user5306470
在仅使用代码工作6个月后,进行一些小的复习总是很好的。 - ttorbik
谢谢,我的问题是我将它连接到了 ViewController 而不是单元格。 - Stella
谢谢,你节省了我的时间。通常我想要编辑collectionViewCell类,但我却在编辑CollectionView类。所以通过你的答案,我明白了发生了什么。 - Erhan Demirci

23

如果你正在使用表格视图来显示设置和其他选项(就像内置的设置应用程序一样),那么可以在属性检查器下将你的表格视图内容设置为静态单元格。此外,要做到这一点,必须将你的表格视图嵌入到一个UITableViewController实例中。


在我看来,这种方法更简单、更快,应该被接受为答案。 - Jaime Agudo

5

你不必使用IBOutlet来引用视图中的对象。 你可以给tableViewCell中的Label设置一个标签值,例如将标签设置为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 
}

1

我有一个 UIViewcontroller,里面有一个带有自定义单元格的表视图。我将UILabel的输出口映射到UItableviewcell上,并将其连接到UIViewController上,然后出现了错误。


在您的自定义类中创建自定义单元格类并实例化IBOutlet。 - Muhammad Shauket

0

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


0

0
有时候Xcode无法正确控制单元格插座连接。
不知怎么的,我的当前单元格的标签/按钮已经连接到另一个单元格了,我只需要删除它们就可以消除错误。

-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接