我在故事板(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中的组件
这是我的参考。
答案 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)
}
}