奥特莱斯不能连接到重复的内容iOS

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

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

有人可以帮我吗? 我已经成功地完成了这个任务,但是这一次却把这个错误当成了我的错。

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

如果您正在使用表格视图来显示“设置”和其他选项(如内置的“设置”应用程序),则可以将“ 表格视图内容”设置为“属性”检查器 静态单元格 。 此外,要做到这一点,你必须embedded你的表视图在UITableViewController实例。

有两种types的表格视图单元格,通过故事板提供给你,它们是dynamic原型静态单元格

在这里输入图像描述

1.dynamic原型

从名字来看,这种types的单元格是dynamic生成的。 他们是通过你的代码控制的,而不是故事板。 在表视图的委托和数据源的帮助下,您可以编程方式指定单元格的数量,单元格的高度,单元格的原型。

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

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

在这里输入图像描述

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

在这里输入图像描述

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

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

2.静态细胞

另一方面,静态单元确实通过故事板进行configuration。 您必须将UI元素拖放到每个单元格以创build它们。 你将控制细胞的数量,高度等故事板。 在这种情况下,您将看到与您从故事板中创build的视图完全相同的表格视图。 静态单元格更常用于设置页面,单元格不会有太大变化。

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

在这里输入图像描述

有了我,我有一个UIViewcontroller ,进入它,我有一个自定义单元格上的tableview。 我将UILabel的出口映射到UItableviewcellUIViewController然后得到错误。

或者,您不必使用IBOutlet来查看视图中的对象。 您可以在tableViewCell中为标签赋予一个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 }