首页 > 解决方案 > 在 Xcode 中以编程方式在导航栏下方设置标签

问题描述

最近,我决定在我的 IOS 应用程序上停止使用故事板。所以,我现在正在用代码学习一切。我试图放置一个label下面的navigationBar视图,但出现错误,我不知道如何调试它。请查看我的代码并分享您的想法。

class SellBaseViewController: UIViewController {

    lazy var container: UIStackView = {
        let stackView = UIStackView(frame: .zero)
        stackView.alignment = .fill
        stackView.axis = .vertical
        stackView.spacing = 2
        stackView.willSetConstraints()
        return stackView
    }()

    lazy var navHeader: UIView! = {
        return self.navBar()
    }()

    lazy var firstLabel: UILabel! = {
        return self.labelOne()
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        if !Authentication.shared.isAuthenticated {
            showLogin()
        } else {
            self.setupInterface()
        }
    }

    private func setupInterface() {
        self.navigationController?.navigationBar.isHidden = true
        self.embedInScrollView(content: self.container)
        navHeader.willSetConstraints()
        firstLabel.willSetConstraints()
        self.container.addArrangedSubviews([self.navHeader!, self.firstLabel!])
        DispatchQueue.main.async {

            NSLayoutConstraint.activate([
                self.navHeader.heightAnchor.constraint(equalToConstant: 44),
                self.navHeader.widthAnchor.constraint(equalTo: self.view.widthAnchor),
                self.navHeader.topAnchor.constraint(equalTo: self.container.topAnchor),
                ])
        }
    }


    // MARK: NAVBAR
    func navBar() -> UIView {
        let navBar = UIView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: self.view.frame.width, height: 44)))
        navBar.backgroundColor = UIColor.constants.darkBlue
        let backIcon = UIImage(named: "ic_back")?.withRenderingMode(.alwaysTemplate)
        let returnButton = UIButton(type: .custom)
        returnButton.imageView?.tintColor = UIColor.white
        returnButton.setImage(backIcon, for: .normal)
        returnButton.image(for: .normal)
        returnButton.titleLabel?.font = UIFont(name: "Hind", size: 18)
        returnButton.setTitle("Sell", for: .normal)
        returnButton.setTitleColor(UIColor.white, for: .normal)
        returnButton.addTarget(self, action: #selector(self._return), for: .touchUpInside)
        returnButton.willSetConstraints()

        navBar.addSubviews([returnButton])
        NSLayoutConstraint.activate([
            returnButton.centerYAnchor.constraint(equalTo: navBar.centerYAnchor),
            returnButton.leadingAnchor.constraint(equalTo: navBar.leadingAnchor, constant: 11),
            returnButton.heightAnchor.constraint(equalToConstant: 24),
            returnButton.widthAnchor.constraint(equalToConstant: 71),
            ])
        return navBar
    }
    func labelOne() -> UILabel{
        let label = UILabel()
        label.textAlignment = .center
        label.textColor = .white
        label.font = UIFont(name: "Avenir-Light", size: 15.0)
        label.text = "This is a Label"
        self.view.addSubview(label)
        return labelOne()
    }
    @objc func _return() {
        self.backHome()
    }

}

navBar 显示良好,但是当我添加 时label,应用程序不断崩溃并出现此错误。我不知道如何确切地找出错误是什么:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee6703fe8)

标签: iosswiftxcodelabel

解决方案


    func labelOne() -> UILabel{
        let label = UILabel()
        label.textAlignment = .center
        label.textColor = .white
        label.font = UIFont(name: "Avenir-Light", size: 15.0)
        label.text = "This is a Label"
        self.view.addSubview(label)
        return labelOne()
    }

你做了:

    return labelOne()

你应该做:

    return label

推荐阅读