首页 文章

Outlets无法连接到重复内容iOS

提问于
浏览
126

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

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

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

6 回答

  • 151

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

  • 2

    通过故事板为您提供了两种类型的表视图单元格,它们是 Dynamic PrototypesStatic Cells

    enter image description here

    1. Dynamic Prototypes

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

    将单元格拖到表视图时,您将声明单元格的原型 . 然后,您可以基于此原型创建任意数量的单元格,然后通过编程方式将 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. Static Cells

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

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

    enter image description here

  • 0

    如果您使用表格视图来显示设置和其他选项(如内置的设置应用程序那样),那么您可以将 Table View Content 设置为 Static Cells the Attributes Inspector . 此外,要执行此操作,必须将表视图嵌入到UITableViewController实例中 .

  • 19

    或者您不必使用 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 
    }
    
  • 40

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

  • 0

    正如大多数人所指出的那样, subclassing UITableViewCell 解决了这个问题 . 但这是不允许的原因,因为原型单元格( UITableViewCell )是由Apple定义的,您无法添加任何自己的插座 .

相关问题