将约束从视图传递到控制器 (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】:

您没有为名为@9​​87654321@ 的视图设置约束。我建议你使用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)的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量从控制器传递到视图 joomla mvc

MVC4 将模型从视图传递到控制器

C# MVC 使用 dotnetfiddle 将参数从视图传递到控制器

如何将数据从剃刀视图传递到 mvc3 中的控制器?

将数据从 MVC 控制器传递到 PHP 中的视图

ASP .NET MVC 3 - 将参数从视图传递到控制器