UIView引用错误

时间:2017-01-12 12:43:44

标签: ios xcode uiview swift3

我在故事板(Xcode 8.2.1)中创建了UIView。我将内部的东西引用到UIView类名LoginView。我错误地删除了一件事,然后我在Bundle.main.loadNibNamed("LoginView", owner: self, options: nil)的行中出错了。 EXC_BAD_ACCESS(code=2,....)我在这里的一些答案中读到了这一点,他们谈到引用缺失。我尝试再次引用所有内容但仍然出错。我现在很困惑我应该把它引用到什么地方。文件所有者或视图。

编辑:当此视图呈现时会发生错误。

LoginView.swift

import UIKit

class LoginView: UIView {

@IBOutlet var view: UIView!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var passwordField: UITextField!
@IBOutlet weak var forgotPasswordBtn: UIButton!

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        Bundle.main.loadNibNamed("LoginView", owner: self, options: nil)
        self.addSubview(view)
        view.frame = self.bounds
        emailField.becomeFirstResponder()

        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIInputViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)

    }

    func dismissKeyboard() {
        view.endEditing(true)
    }
}

这是我在LoginView StoryBoard中的组件

enter image description here

这是我的参考。

enter image description here

1 个答案:

答案 0 :(得分:0)

有一个名为NibDesignable的CocoaPod,它不仅将nib配置到视图中(带有约束),而且还创建了视图IBDesignable,因此您可以看到基于nib的视图故事板。

NibDesignable要求您将nib的文件所有者更改为视图类而不是nib的视图自定义类。此外,出口连接必须来自文件的所有者,而不是来自笔尖的视图。

@IBDesignable class LoginView: NibDesignable {

    // MARK: Outlets

    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var passwordField: UITextField!
    @IBOutlet weak var forgotPasswordBtn: UIButton!

    // MARK: Properties

    var tap: UITapGestureRecognizer? {
        willSet {
            tap.flatMap { removeGestureRecognizer($0) }
        }
        didSet {
            tap.flatMap { addGestureRecognizer($0) }
        }
    }

    // MARK: Lifecycle

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

        tap = UITapGestureRecognizer(
            target: self,
            action: #selector(didRecognizeTapGesture)
        )

        emailField.becomeFirstResponder()
    }

    // MARK: Actions

    @IBAction func didRecognizeTapGesture() {

        endEditing(true)
    }
}