无法从 TabBarController 访问 UIView 子类 IBOutlets
Unable to access UIView subclass IBOutlets From TabBarController
我有一个带有 xib 的 UIView Class。我尝试将它作为弹出视图添加到另一个 ViewControllers 中。我有插座连接。但是当我 运行 应用程序崩溃并显示
This class is not key value coding-compliant for the key btnAbtUs
我认为问题是应该select委托。我可能使用错误的方式来添加这个 xib。我该如何更正它?
这是我的代码。
我的 UIView
子类
class MoreView: UIView {
@IBOutlet var containerView: UIView!
@IBOutlet weak var btnAboutUs: UIButton!
override public func awakeFromNib() {
super.awakeFromNib()
}
override init(frame: CGRect) {
super.init(frame: frame)
loadViewFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadViewFromNib()
}
func loadViewFromNib() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "MoreView", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.insertSubview(view, at: 0)
commitInit()
}
private func commitInit(){
containerView.translatesAutoresizingMaskIntoConstraints = true
self.btnAboutUs.addTarget(self, action: #selector(self.clickAboutUs(_:)), for: .touchUpInside)
}
class func instanceFromNib() -> UIView {
return UINib(nibName: "MoreView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}
@objc func clickAboutUs(_ sender: Any) {
print("tap")
}
}
在UITabBarController
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
let moreView = MoreView.instanceFromNib
if let navigationController = viewController as? UINavigationController,
navigationController.viewControllers.contains(where: { [=11=] is MoreViewController }) {
moreView().frame.origin.y = 100
self.view.addSubview(moreView())
return false
} else {
moreView().removeFromSuperview()
return true
}
}
您可能已经复制了 XIB 而忘记了 remove/add 与 IBOutlet 的连接。请检查。
表示已连接的 Interface Builder 对象在其所有者的来源(文件所有者)中是removed/renamed。
您可能忘记删除与 IBOutlet 的连接。请检查显示连接 inspector.First 单击 xib 的文件检查器,然后单击显示连接检查器。如图所示。
移除损坏的插座。
终于找到问题了。这是将 UIView 添加为 UIViewController 的子视图控制器的正确方法。
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if let navigationController = viewController as? UINavigationController,
navigationController.viewControllers.contains(where: { [=10=] is MoreViewController }) {
let mySubView : MoreView
mySubView = MoreView(frame: CGRect(x: 0, y: 0, width: 375, height: 667) )
self.view.addSubview(mySubView)
return false
} else {
return true
}
}
我有一个带有 xib 的 UIView Class。我尝试将它作为弹出视图添加到另一个 ViewControllers 中。我有插座连接。但是当我 运行 应用程序崩溃并显示
This class is not key value coding-compliant for the key btnAbtUs
我认为问题是应该select委托。我可能使用错误的方式来添加这个 xib。我该如何更正它?
这是我的代码。
我的 UIView
子类
class MoreView: UIView {
@IBOutlet var containerView: UIView!
@IBOutlet weak var btnAboutUs: UIButton!
override public func awakeFromNib() {
super.awakeFromNib()
}
override init(frame: CGRect) {
super.init(frame: frame)
loadViewFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadViewFromNib()
}
func loadViewFromNib() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "MoreView", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.insertSubview(view, at: 0)
commitInit()
}
private func commitInit(){
containerView.translatesAutoresizingMaskIntoConstraints = true
self.btnAboutUs.addTarget(self, action: #selector(self.clickAboutUs(_:)), for: .touchUpInside)
}
class func instanceFromNib() -> UIView {
return UINib(nibName: "MoreView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}
@objc func clickAboutUs(_ sender: Any) {
print("tap")
}
}
在UITabBarController
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
let moreView = MoreView.instanceFromNib
if let navigationController = viewController as? UINavigationController,
navigationController.viewControllers.contains(where: { [=11=] is MoreViewController }) {
moreView().frame.origin.y = 100
self.view.addSubview(moreView())
return false
} else {
moreView().removeFromSuperview()
return true
}
}
您可能已经复制了 XIB 而忘记了 remove/add 与 IBOutlet 的连接。请检查。
表示已连接的 Interface Builder 对象在其所有者的来源(文件所有者)中是removed/renamed。
您可能忘记删除与 IBOutlet 的连接。请检查显示连接 inspector.First 单击 xib 的文件检查器,然后单击显示连接检查器。如图所示。
移除损坏的插座。
终于找到问题了。这是将 UIView 添加为 UIViewController 的子视图控制器的正确方法。
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if let navigationController = viewController as? UINavigationController,
navigationController.viewControllers.contains(where: { [=10=] is MoreViewController }) {
let mySubView : MoreView
mySubView = MoreView(frame: CGRect(x: 0, y: 0, width: 375, height: 667) )
self.view.addSubview(mySubView)
return false
} else {
return true
}
}