将约束从视图传递到控制器 (MVC)
Posted
技术标签:
【中文标题】将约束从视图传递到控制器 (MVC)【英文标题】:Pass constraint from View to Controller (MVC) 【发布时间】:2021-01-13 07:44:40 【问题描述】:我正在编写我的第一个关于 MVC 架构的项目。我是初学者,可能会错过一个简单的。但我就是不知道如何在 View 中实现约束并将其传递给 Controller。
查看:
import UIKit
class ViewExample: UIView
var textView: UITextView =
let textView = UITextView()
textView.translatesAutoresizingMaskIntoConstraints = false
textView.text = "Hello, world!"
return textView
()
func setupViews()
addSubview(textView)
NSLayoutConstraint.activate([
textView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 10),
textView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10),
textView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -10),
textView.heightAnchor.constraint(equalTo: textView.widthAnchor, multiplier: 2)
])
override init(frame: CGRect)
super.init(frame: frame)
setupViews()
required init?(coder: NSCoder)
super.init(coder: coder)
setupViews()
控制器:
import UIKit
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
let ve = ViewExample()
ve.setupViews()
view.addSubview(ve)
我需要解决什么问题才能使其正常工作?
【问题讨论】:
嘿!我对你在这里想要做什么感到困惑。我可以看到你已经为你的ViewExample
设置了约束,因为它被初始化了,你正在将它添加到你的 VC 中。将约束从视图“传递”到 VC 到底是什么意思?如果您可以在此处包含您想要实现的目标会更好
另外,与您的问题无关,但您不需要显式调用setupViews()
,因为您在初始化ViewExample()
时会调用您的init(frame: CGRect)
【参考方案1】:
您没有为名为@987654321@ 的视图设置约束。我建议你使用SnapKit
cocoapod。它可以帮助您轻松地为您的视图设置约束。
并像这样更新。
import SnapKit
class ViewExample: UIView
....
func setupViews()
addSubview(textView)
textView.snp.makeConstraints
$0.edges.equalToSuperview()
$0.height.equalTo(textView.snp.width).multipliedBy(2)
import SnapKit
class ViewController
....
override func viewDidLoad()
super.viewDidLoad()
let ve = ViewExample()
ve.setupViews()
view.addSubview(ve)
ve.snp.makeConstraints
$0.top.equalToSuperview().offset(20)
$0.left.equalToSuperview().offset(20)
$0.right.equalToSuperview().offset(-20)
....
如果您不想使用 SnapKit,请将以下代码添加到 viewDidLoad
方法中。
首先,在setupViews
方法中为textView
添加底部约束。
let ve = ViewExample()
ve.setupViews()
view.addSubview(ve)
ve.translateAutoresizingMaskIntoConstraints = false
ve.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
ve.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
ve.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 20).isActive = true
【讨论】:
【参考方案2】:看来我还是很明显不知道如何表达一个想法。但是感谢您的回答-我找到了解决方案。结果太容易了..
查看:
class ViewEx: UIView
lazy var textView: UITextView =
let textView = UITextView()
textView.translatesAutoresizingMaskIntoConstraints = false
textView.text = "Hello, world!"
textView.textAlignment = .center
textView.backgroundColor = .gray
return textView
()
控制器:
class ViewController: UIViewController
let ve = ViewEx()
override func viewDidLoad()
super.viewDidLoad()
addSubviews()
setupConstraint()
func addSubviews()
view.addSubview(ve.textView)
func setupConstraint()
NSLayoutConstraint.activate([
ve.textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10),
ve.textView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
ve.textView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
ve.textView.heightAnchor.constraint(equalTo: ve.textView.widthAnchor, multiplier: 2)
])
【讨论】:
以上是关于将约束从视图传递到控制器 (MVC)的主要内容,如果未能解决你的问题,请参考以下文章