【问题标题】:App crashes when changing NSConstraints for UIToolBar更改 UIToolBar 的 NSConstraints 时应用程序崩溃
【发布时间】:2019-11-06 11:43:55
【问题描述】:

基本上我想在选择文本字段后在键盘上方显示一个 UIToolBar。

选择要编辑的文本字段时出现以下错误:

由于未捕获的异常“NSGenericException”而终止应用程序, 原因:'无法使用锚激活约束 和 因为他们没有共同的祖先。约束或它的 在不同的视图层次结构中锚定参考项目?那是 非法。'

在 viewDidLoad 中我执行以下操作:

let toolBar = UIToolbar()
var items = [UIBarButtonItem]()

items.append(
    UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
)

items.append(
    UIBarButtonItem(title: "Tool Bar Text", style: .plain, target: self, action: #selector(confirmSignature))
)

items.append(
    UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
)

toolBar.setItems(items, animated: true)
toolBar.tintColor = .white
toolBar.barTintColor = UIColor.red



toolBar.translatesAutoresizingMaskIntoConstraints = false


if #available(iOS 11.0, *) {
    let guide = self.view.safeAreaLayoutGuide
    toolBar.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
    toolBar.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
    toolBar.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true
    toolBar.heightAnchor.constraint(equalToConstant: 80).isActive = true

}
else {
    NSLayoutConstraint(item: toolBar, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: toolBar, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: toolBar, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true

    toolBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
}

exampleTextField.inputAccessoryView = toolBar

作为扩展,我在选择文本字段时执行以下操作:

extension myTableViewName: UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == exampleTextField {
            let toolBar = UIToolbar()

            view.addSubview(toolBar)
        }
    }
}

【问题讨论】:

  • 检查有效约束是否存在。

标签: ios swift


【解决方案1】:

注释这些行(文本字段附件和视图之间没有共同视图)

let guide = self.view.safeAreaLayoutGuide
toolBar.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
toolBar.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
toolBar.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true

由于 toolBar 输入视图总是在指定高度的底部占据屏幕的整个宽度,你只能离开这个

toolBar.heightAnchor.constraint(equalToConstant: 80).isActive = true

【讨论】:

  • 是否可以将带有“工具栏文本”文本的 UIBarButton 抬高一点,使其以新高度居中?
【解决方案2】:

工具栏未添加到视图中,如错误消息所述。

self.view.addSubview(toolBar)

【讨论】:

  • 这将添加它以一直查看并在单击该字段时消失,即使在该字段内没有点击
  • 无法在不添加到视图的情况下设置约束,因为您的指南引用了 self.view。
  • @Sh_Khan 的回答似乎可以解决问题,您知道现在是否可以将UIBarButtonItem(title: "Tool Bar Text" 提高一点以使其处于新高度的中心?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多