尝试以编程方式加载笔尖,接收 Xcode 6 中未遇到的无数错误
Trying to load a nib programatically receiving myriad errors that weren't encountered in Xcode 6
我启动了一个试图重用某些功能的旧项目。
我创建了一个带有 UIView 子类的笔尖。在最初的工作版本中,我不需要在 IB 中设置 File's owner
。但是,我收到错误提示我现在需要这样做 (Xcode 7):loaded the "TipView" nib but the view outlet was not set.
所以我继续将 File's owner
连接到负责设置视图的视图控制器。这是来自视图控制器的相关代码:
class TipViewController: UIViewController {
private let kTipViewHeight: CGFloat = 400
private let kTipViewWidth: CGFloat = 300
override func viewDidLoad() {
super.viewDidLoad()
if let tipView = createTipView() {
let center = CGPoint(x: CGRectGetWidth(view.bounds)/2, y: CGRectGetHeight(view.bounds)/2)
tipView.center = center
view.addSubview(tipView)
}
}
func createTipView() -> UIView? {
if let view = UINib(nibName: "TipView", bundle: nil).instantiateWithOwner(nil, options: nil).first as? TipView {
view.frame = CGRect(x: 0, y: 0, width: kTipViewWidth, height: kTipViewHeight)
return view
}
return nil
}
}
extension UIViewController {
func presentTips(tips: [Tip], animated: Bool, completion: (() -> Void)?) {
let controller = TipViewController()
controller.modalTransitionStyle = .CrossDissolve
presentViewController(controller, animated: animated, completion: completion)
}
}
我尝试将 instantiateWithOwner
设置为:.instantiateWithOwner(self, options: nil).first
(将 nil
更改为 self
)也无济于事。
这是相关的呈现视图控制器代码:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
presentTips([], animated: true, completion: nil)
}
UIView 子类没有做任何异常的事情,所以我懒得包含它的代码。
当我进行更改请求时 - 添加 TipViewController 作为 nib 的文件所有者并将其 view
出口连接到 nib 视图 - 我收到一系列错误消息,具体取决于我采用的配置,包括:
this class is not key value coding-compliant for the key view.
Can't add self as subview
不确定为什么我能够在 Xcode 6 中使用没有文件所有者的笔尖,但从 Xcode 7 开始我不能这样做 - 没有找到任何 material 或与更改相关的发行说明,所以我现在有点难过。
非常感谢任何帮助。
So I proceeded to hook the File's owner up to the view controller that is responsible for setting up the view
不,你第一次是对的。你的问题是在 iOS 8 中有一个与 nib 名称有关的错误,它在 iOS 9 中被修复了,你被困在网上因为这个错误,具有讽刺意味的是,保护你免于绊倒之前讨论过这个问题。
这样做:
保留文件所有者配置为 NSObject。
不要将文件所有者的任何出口连接到 nib 中的视图;有这样的outlet就删掉吧
用 nil
所有者加载笔尖,就像您正在做的那样。
(准备好了吗?这是关键:)重命名笔尖。不要称它为 TipView.xib。该名称是导致您一直试图解决的整个问题的原因。称它为 TipViewNib.xib。相应地修改您的代码,即用 nibName: "TipViewNib"
.
加载笔尖
清除所有缓存,包括模拟器版本(正如我在此处解释的:How to Empty Caches and Clean All Targets Xcode 4)以摆脱坏笔尖(名称为 [=50 的笔尖) =]).
你的烦恼会像晨雾一样烟消云散。
我启动了一个试图重用某些功能的旧项目。
我创建了一个带有 UIView 子类的笔尖。在最初的工作版本中,我不需要在 IB 中设置 File's owner
。但是,我收到错误提示我现在需要这样做 (Xcode 7):loaded the "TipView" nib but the view outlet was not set.
所以我继续将 File's owner
连接到负责设置视图的视图控制器。这是来自视图控制器的相关代码:
class TipViewController: UIViewController {
private let kTipViewHeight: CGFloat = 400
private let kTipViewWidth: CGFloat = 300
override func viewDidLoad() {
super.viewDidLoad()
if let tipView = createTipView() {
let center = CGPoint(x: CGRectGetWidth(view.bounds)/2, y: CGRectGetHeight(view.bounds)/2)
tipView.center = center
view.addSubview(tipView)
}
}
func createTipView() -> UIView? {
if let view = UINib(nibName: "TipView", bundle: nil).instantiateWithOwner(nil, options: nil).first as? TipView {
view.frame = CGRect(x: 0, y: 0, width: kTipViewWidth, height: kTipViewHeight)
return view
}
return nil
}
}
extension UIViewController {
func presentTips(tips: [Tip], animated: Bool, completion: (() -> Void)?) {
let controller = TipViewController()
controller.modalTransitionStyle = .CrossDissolve
presentViewController(controller, animated: animated, completion: completion)
}
}
我尝试将 instantiateWithOwner
设置为:.instantiateWithOwner(self, options: nil).first
(将 nil
更改为 self
)也无济于事。
这是相关的呈现视图控制器代码:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
presentTips([], animated: true, completion: nil)
}
UIView 子类没有做任何异常的事情,所以我懒得包含它的代码。
当我进行更改请求时 - 添加 TipViewController 作为 nib 的文件所有者并将其 view
出口连接到 nib 视图 - 我收到一系列错误消息,具体取决于我采用的配置,包括:
this class is not key value coding-compliant for the key view.
Can't add self as subview
不确定为什么我能够在 Xcode 6 中使用没有文件所有者的笔尖,但从 Xcode 7 开始我不能这样做 - 没有找到任何 material 或与更改相关的发行说明,所以我现在有点难过。
非常感谢任何帮助。
So I proceeded to hook the File's owner up to the view controller that is responsible for setting up the view
不,你第一次是对的。你的问题是在 iOS 8 中有一个与 nib 名称有关的错误,它在 iOS 9 中被修复了,你被困在网上因为这个错误,具有讽刺意味的是,保护你免于绊倒之前讨论过这个问题。
这样做:
保留文件所有者配置为 NSObject。
不要将文件所有者的任何出口连接到 nib 中的视图;有这样的outlet就删掉吧
用
nil
所有者加载笔尖,就像您正在做的那样。(准备好了吗?这是关键:)重命名笔尖。不要称它为 TipView.xib。该名称是导致您一直试图解决的整个问题的原因。称它为 TipViewNib.xib。相应地修改您的代码,即用
nibName: "TipViewNib"
. 加载笔尖
清除所有缓存,包括模拟器版本(正如我在此处解释的:How to Empty Caches and Clean All Targets Xcode 4)以摆脱坏笔尖(名称为 [=50 的笔尖) =]).
你的烦恼会像晨雾一样烟消云散。