Outlets无法连接到重复内容iOS

Tom*_*sta 138 storyboard ios

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

从TableViewController到UILabel的detailText Outlet无效.插座无法连接到重复内容.

有人可以帮我吗?我已经按照我一直成功的方式设置了它,但这一次它让我知道了这个错误.

Wai*_*ain 166

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

  • @Wain你可以加入关于访问这些网点的更多信息吗? (8认同)

Fan*_*ing 60

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

在此输入图像描述

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
}
Run Code Online (Sandbox Code Playgroud)

2.静电池

另一方面,静态单元确实是通过故事板配置的.您必须将UI元素拖动到每个单元格以创建它们.您将从故事板控制单元格编号,高度等.在这种情况下,您将看到一个表格视图,与您从故事板创建的内容完全相同.静态单元格更常用于设置页面,单元格不会发生很大变化.

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

在此输入图像描述

  • 我很欣赏图形:) (3认同)
  • 非常感谢您的图形,使您的答案非常简单明了!:) (2认同)

Jus*_*itz 22

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


SLN*_*SLN 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 
}
Run Code Online (Sandbox Code Playgroud)