Swift Stackview标签未以编程方式添加

Swift Stackview标签未以编程方式添加,swift,Swift,我试着在没有故事板的情况下做任何事情,但在添加我的标签时,我一直得到零,但我不明白为什么。我确信这非常简单,我是瞎了眼,但我只是在谷歌搜索了很多次后才看到它 视图控制器: class SquaresViewController: UIViewController { let stackView = OAStackView() let titleView = TitleView(frame: CGRect.zero) @IBOutlet

我试着在没有故事板的情况下做任何事情,但在添加我的标签时,我一直得到零,但我不明白为什么。我确信这非常简单,我是瞎了眼,但我只是在谷歌搜索了很多次后才看到它

视图控制器:

    class SquaresViewController: UIViewController {

        let stackView = OAStackView()
        let titleView = TitleView(frame: CGRect.zero)

        @IBOutlet var squaresCollectionView: UICollectionView!

        override func viewDidLoad() {
            super.viewDidLoad()

            stackView.axis = .vertical
            stackView.translatesAutoresizingMaskIntoConstraints = false

            stackView.addArrangedSubview(titleView)
            titleView.snp.makeConstraints { make in
                make.height.equalTo(50)
                make.top.equalTo(view.snp.top)
                make.left.equalTo(view.snp.left)
                make.right.equalTo(view.snp.right)
            }

        }
    }
标题视图:

    import UIKit

    class TitleView: UIView {

        @IBOutlet weak var titleText: UILabel!

        override init(frame: CGRect) {
            super.init(frame: frame)
            self.translatesAutoresizingMaskIntoConstraints = false
            createView()
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

        func createView() {
            titleText = UILabel(frame: CGRect.zero)
            titleText.translatesAutoresizingMaskIntoConstraints = false

            titleText.text = "Tappy tap tap a square!"
            titleText.textAlignment = .center
            titleText.numberOfLines = 0

            self.addSubview(titleText)

            titleText.snp.makeConstraints { make in
                make.edges.equalTo( self.snp.edges )
            }
        }
    }
构建时,它会在以下位置发生故障:

    titleText.translatesAutoresizingMaskIntoConstraints = false
与:

致命错误:在展开可选值时意外发现nil


首先,如果不想使用故事板,我不明白为什么要为titleText创建一个
IBOutlet
。如果不想使用故事板,请将实现更改为:

var titleText : UILabel!
其次,应用程序正在崩溃,因为您要求它对尚未添加到层次结构的视图执行操作。为了便于阅读,除了那些重要的行外,我已经注释掉了所有的行。见下文:

func createView() {
    //titleText = UILabel(frame: CGRect.zero)
    titleText.translatesAutoresizingMaskIntoConstraints = false // <-- You are trying to perform an operation on titleText here

    //titleText.text = "Tappy tap tap a square!"
    //titleText.textAlignment = .center
    //titleText.numberOfLines = 0

    self.addSubview(titleText) // <-- but you are adding it to the view hierarchy here

    //titleText.snp.makeConstraints { make in
        //make.edges.equalTo( self.snp.edges )
    //}
}
因此,请尝试将实现更改为这样:

import UIKit

class TitleView: UIView {

    var titleText: UILabel!

    override init(frame: CGRect) {
        // leave as is, removed for space
    }

    required init?(coder aDecoder: NSCoder) {
        // leave as is, removed for space
    }

    func createView() {
        titleText = UILabel(frame: CGRect.zero)
        titleText.text = "Tappy tap tap a square!"
        titleText.textAlignment = .center
        titleText.numberOfLines = 0

        self.addSubview(titleText)
        titleText.translatesAutoresizingMaskIntoConstraints = false

        titleText.snp.makeConstraints { make in
            make.edges.equalTo( self.snp.edges )
        }
    }
}

非常感谢你。我试着重新安排一切,但iboutlet是主要问题。没问题@韦纳伦布尔
import UIKit

class TitleView: UIView {

    var titleText: UILabel!

    override init(frame: CGRect) {
        // leave as is, removed for space
    }

    required init?(coder aDecoder: NSCoder) {
        // leave as is, removed for space
    }

    func createView() {
        titleText = UILabel(frame: CGRect.zero)
        titleText.text = "Tappy tap tap a square!"
        titleText.textAlignment = .center
        titleText.numberOfLines = 0

        self.addSubview(titleText)
        titleText.translatesAutoresizingMaskIntoConstraints = false

        titleText.snp.makeConstraints { make in
            make.edges.equalTo( self.snp.edges )
        }
    }
}