Ios 添加多个UITexfields或约束并运行应用程序后,视图控制器将立即变为全白色

Ios 添加多个UITexfields或约束并运行应用程序后,视图控制器将立即变为全白色,ios,swift,xcode,constraints,Ios,Swift,Xcode,Constraints,我知道这个问题已经被问了很多次了,有很多答案。我在互联网上搜索了好几天,阅读了数百篇StackOverflow和其他关于这个问题的文章 当我以编程方式设计视图时,一切都会正常工作,直到我添加多个UI文本字段,当你运行应用程序时,屏幕会变成全白色。当我只有一个文本字段和一个按钮时,在UIView或UIStackView中,它工作并加载 我已经按照苹果推荐的方式设置了视图控制器,甚至直接从AppDelegate推送了这个文件,它仍然变为白色 大约2-3分钟后,应用程序终于崩溃了,代码如下:线程1:E

我知道这个问题已经被问了很多次了,有很多答案。我在互联网上搜索了好几天,阅读了数百篇StackOverflow和其他关于这个问题的文章

当我以编程方式设计视图时,一切都会正常工作,直到我添加多个UI文本字段,当你运行应用程序时,屏幕会变成全白色。当我只有一个文本字段和一个按钮时,在UIView或UIStackView中,它工作并加载

我已经按照苹果推荐的方式设置了视图控制器,甚至直接从AppDelegate推送了这个文件,它仍然变为白色

大约2-3分钟后,应用程序终于崩溃了,代码如下:线程1:EXC_资源类型_内存(limit=650 MB,unused=0x0)

当你观察内存时,它会一次又一次地上升,然后每次发生这种情况时都会崩溃。如果我删除了所有代码并构建了一个基本的UI,它就可以正常工作

我已经检查了断点,没有断点。我已经清除了我的派生数据,但仍然存在。我在iPhone7、8和XR上进行了类似的尝试,也在物理iPhoneXR和iPhone6上进行了尝试,同样,整个设备都是白色的

我正在寻找一些关于我在代码中哪里犯了一个可能导致这种情况的错误的指导

下面是导致白度的LoginView控制器和登录视图的代码

LoginView.swift

class LoginView: UIView {

    fileprivate enum Text: String {
        case email, password
        case login = "Log In"
    }

    fileprivate enum Font: String {
        case regular = "AvenirNext-Regular"
    }

    let emailTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = Text.email.rawValue.capitalized
        textField.font = UIFont(name: Font.regular.rawValue, size: 17.0)
        textField.textColor = UIColor.darkGray
        textField.minimumFontSize = 17.0
        textField.borderStyle = UITextField.BorderStyle.roundedRect
        textField.setUpKeyboard(KeyboardType.email, returnKeyType: UIReturnKeyType.next)
        return textField
    }()
    let passwordTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = Text.password.rawValue.capitalized
        textField.font = UIFont(name: Font.regular.rawValue, size: 17.0)
        textField.textColor = UIColor.darkGray
        textField.minimumFontSize = 17.0
        textField.borderStyle = UITextField.BorderStyle.roundedRect
        textField.setUpKeyboard(KeyboardType.password, returnKeyType: UIReturnKeyType.send)
        return textField
    }()
    let loginButton: UIButton = {
        let button = UIButton(type: UIButton.ButtonType.system)
        button.titleLabel?.font = UIFont(name: Font.regular.rawValue, size: 17.0)
        button.setTitle(Text.login.rawValue, for: UIControl.State.normal)
        button.setTitleColor(UIColor.white, for: UIControl.State.normal)
        button.backgroundColor = UIColor.clear
        button.layer.borderColor = UIColor.white.cgColor
        button.layer.borderWidth = 1.0
        button.setCorner(radius: 5.0)
        return button
    }()

    fileprivate lazy var stackView: UIStackView = { [unowned self] in
        let stackView = UIStackView(arrangedSubviews: [self.emailTextField, self.passwordTextField, self.loginButton])
        stackView.axis = NSLayoutConstraint.Axis.vertical
        stackView.distribution = UIStackView.Distribution.fillEqually
        stackView.alignment = UIStackView.Alignment.fill
        stackView.spacing = 10.0
        return stackView
        }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setSubviewForAutoLayout(self.stackView)
        self.backgroundColor = UIColor.darkGray

        self.stackView.snp.remakeConstraints { [unowned self] (make: ConstraintMaker) in
            make.center.equalTo(self)
            make.leading.equalTo(self).offset(40.0)
            make.trailing.equalTo(self).offset(-40.0)

        }

        self.emailTextField.snp.makeConstraints { [unowned self] (make: ConstraintMaker) in
            make.height.equalTo(self).multipliedBy(0.075)
        }
    }

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


}
class LoginViewController: UIViewController {

    override func loadView() {
        self.view = LoginView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.loginButton.addTarget(self, action: #selector(loginButtonPressed), for: UIControl.Event.touchUpInside)
        // Do any additional setup after loading the view, typically from a nib.
    }

    // MARK: - IBOutlets
    weak var loginView: LoginView! { return self.view as! LoginView }
    weak var emailTextField: UITextField! { return loginView.emailTextField }
    weak var passwordTextField: UITextField! { return loginView.passwordTextField }
    weak var loginButton: UIButton! { return loginView.loginButton }

    // MARK: - IBActions
    @objc func loginButtonPressed() {
        print("Login!")
    }

}
LoginViewController.swift

class LoginView: UIView {

    fileprivate enum Text: String {
        case email, password
        case login = "Log In"
    }

    fileprivate enum Font: String {
        case regular = "AvenirNext-Regular"
    }

    let emailTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = Text.email.rawValue.capitalized
        textField.font = UIFont(name: Font.regular.rawValue, size: 17.0)
        textField.textColor = UIColor.darkGray
        textField.minimumFontSize = 17.0
        textField.borderStyle = UITextField.BorderStyle.roundedRect
        textField.setUpKeyboard(KeyboardType.email, returnKeyType: UIReturnKeyType.next)
        return textField
    }()
    let passwordTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = Text.password.rawValue.capitalized
        textField.font = UIFont(name: Font.regular.rawValue, size: 17.0)
        textField.textColor = UIColor.darkGray
        textField.minimumFontSize = 17.0
        textField.borderStyle = UITextField.BorderStyle.roundedRect
        textField.setUpKeyboard(KeyboardType.password, returnKeyType: UIReturnKeyType.send)
        return textField
    }()
    let loginButton: UIButton = {
        let button = UIButton(type: UIButton.ButtonType.system)
        button.titleLabel?.font = UIFont(name: Font.regular.rawValue, size: 17.0)
        button.setTitle(Text.login.rawValue, for: UIControl.State.normal)
        button.setTitleColor(UIColor.white, for: UIControl.State.normal)
        button.backgroundColor = UIColor.clear
        button.layer.borderColor = UIColor.white.cgColor
        button.layer.borderWidth = 1.0
        button.setCorner(radius: 5.0)
        return button
    }()

    fileprivate lazy var stackView: UIStackView = { [unowned self] in
        let stackView = UIStackView(arrangedSubviews: [self.emailTextField, self.passwordTextField, self.loginButton])
        stackView.axis = NSLayoutConstraint.Axis.vertical
        stackView.distribution = UIStackView.Distribution.fillEqually
        stackView.alignment = UIStackView.Alignment.fill
        stackView.spacing = 10.0
        return stackView
        }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setSubviewForAutoLayout(self.stackView)
        self.backgroundColor = UIColor.darkGray

        self.stackView.snp.remakeConstraints { [unowned self] (make: ConstraintMaker) in
            make.center.equalTo(self)
            make.leading.equalTo(self).offset(40.0)
            make.trailing.equalTo(self).offset(-40.0)

        }

        self.emailTextField.snp.makeConstraints { [unowned self] (make: ConstraintMaker) in
            make.height.equalTo(self).multipliedBy(0.075)
        }
    }

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


}
class LoginViewController: UIViewController {

    override func loadView() {
        self.view = LoginView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.loginButton.addTarget(self, action: #selector(loginButtonPressed), for: UIControl.Event.touchUpInside)
        // Do any additional setup after loading the view, typically from a nib.
    }

    // MARK: - IBOutlets
    weak var loginView: LoginView! { return self.view as! LoginView }
    weak var emailTextField: UITextField! { return loginView.emailTextField }
    weak var passwordTextField: UITextField! { return loginView.passwordTextField }
    weak var loginButton: UIButton! { return loginView.loginButton }

    // MARK: - IBActions
    @objc func loginButtonPressed() {
        print("Login!")
    }

}

看起来您没有正确连接代码。例如,您的电子邮件文本字段、密码文本字段和其他变量应如下所示:
@IBOutlet弱var emailTextField:UITextField以便将视图控制器内容连接到类中的代码

检查您的约束条件。他们都对吗?对故事板本身进行约束可能会有所帮助。另外,您可以发送屏幕截图吗?

您发布的代码中没有任何内容看起来会持续使用内存。您可以尝试使用工具或内存图调试器来查看内存中正在创建什么。或者只是评论一些事情,直到问题停止,以缩小原因。@CraigSiemens嗨,Craig,我昨天做了这件事,但我什么也找不到。正如我在下面的帖子中提到的,如果我注释掉密码UITextField的代码,它会工作,并且内存良好。只有当我添加两个UITextfields时,它才会变成白色,然后由于内存问题而崩溃。还有其他建议吗?我知道代码应该是正确的,但我似乎不明白为什么会发生这种情况。我以为@IBOutlet只用于故事板。你是说在本节中,我应该使用@IBOutlet<代码>弱var loginView:loginView!{返回self.view as!LoginView}弱变量emailTextField:UITextField!{return loginView.emailTextField}弱var密码textfield:UITextField!{return loginView.passwordTextField}弱变量loginButton:UIButton!{return loginView.loginButton}
根本不起作用,XCode出错并说它们是不可变的。这是有道理的,因为IBOutlet是用于故事板的,所以我以编程的方式完成我的整个应用程序。我是从头开始写的,因为故事板看起来很恐怖。试图找出自动布局和约束是一场噩梦,我错误地认为使用所有代码可能更容易。自动布局对我来说是,它应该做一切自动。无论如何,我注意到的是,当我向视图控制器添加2个或更多UI文本字段时,当我运行它时,它会变成白色,即使没有约束。但当我有一个它装载。这是我见过的最奇怪的事情。如果你看我上面的代码,我注释掉了整个PasswordTextField闭包,应用程序运行时没有白色屏幕。莫名其妙。