如何正确编写约束代码

时间:2018-03-02 06:37:26

标签: swift xcode swift4 xcode9

我想在UITableViewCell内设置一个UITextView。 在TableView函数的一些方法中,我编写了下面的代码, 但是它会导致以下错误:

  

由于未捕获的异常'NSGenericException'而终止应用,   原因:'无法使用锚点激活约束    和    因为他们   没有共同的祖先。约束或其锚点是否引用   不同视图层次结构中的项目?这是非法的。'

这是我在tableView中的代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = newTableView.dequeueReusableCell(withIdentifier: "NewCell", for: indexPath) as! NewCellTableViewCell
    let tableTextView = UITextView()
    tableTextView.translatesAutoresizingMaskIntoConstraints = false
    tableTextView.leadingAnchor.constraint(equalTo: cell.leadingAnchor).isActive = true
    tableTextView.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true
    tableTextView.widthAnchor.constraint(equalTo: cell.widthAnchor).isActive = true
    tableTextView.heightAnchor.constraint(equalTo: cell.heightAnchor).isActive = true
    cell.addSubview(tableTextView)
    return cell
}

2 个答案:

答案 0 :(得分:1)

首先你应该打电话:

cell.addSubview(tableTextView)

然后附加约束,而且:

  

所有约束必须仅涉及范围内的视图   接收视图。具体而言,所涉及的任何观点都必须是   接收视图本身或接收视图的子视图。

所以你的代码可能是:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = newTableView.dequeueReusableCell(withIdentifier: "NewCell", for: indexPath) as! NewCellTableViewCell
    let tableTextView = UITextView()
    cell.addSubView(tableTextView)
    tableTextView.translatesAutoresizingMaskIntoConstraints = false

    tableTextView.leadingAnchor.constraint(equalTo: cell.leadingAnchor).isActive = true
    tableTextView.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true
    tableTextView.widthAnchor.constraint(equalTo: cell.widthAnchor).isActive = true
    tableTextView.heightAnchor.constraint(equalTo: cell.heightAnchor).isActive = true
    return cell
}

答案 1 :(得分:0)

在应用约束之前,必须将子视图添加到超级视图中:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = newTableView.dequeueReusableCell(withIdentifier: "NewCell", for: indexPath) as! NewCellTableViewCell
    let tableTextView = UITextView()
    tableTextView.translatesAutoresizingMaskIntoConstraints = false
    cell.addSubView(tableTextView)
    tableTextView.leadingAnchor.constraint(equalTo: cell.leadingAnchor).isActive = true
    tableTextView.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true
    tableTextView.widthAnchor.constraint(equalTo: cell.widthAnchor).isActive = true
    tableTextView.heightAnchor.constraint(equalTo: cell.heightAnchor).isActive = true

    return cell
}