【问题标题】:Pass constraint from View to Controller (MVC)将约束从视图传递到控制器 (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)

标签: swift model-view-controller view constants


【解决方案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)
                ])
            }
            
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多