尝试以编程方式加载笔尖,接收 Xcode 6 中未遇到的无数错误
Posted
技术标签:
【中文标题】尝试以编程方式加载笔尖,接收 Xcode 6 中未遇到的无数错误【英文标题】:Trying to load a nib programatically receiving myriad errors that weren't encountered in Xcode 6 【发布时间】:2016-03-19 03:24:15 【问题描述】:我提出了一个试图重用某些功能的旧项目。
我创建了一个带有 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 中我无法这样做 - 没有找到与更改相关的任何材料或发行说明,所以我我现在有点难过。
非常感谢任何帮助。
【问题讨论】:
【参考方案1】:所以我开始将文件的所有者连接到负责设置视图的视图控制器
不,你第一次是对的。你的问题是在 ios 8 中存在一个与 nib 名称有关的错误,它在 iOS 9 中得到了修复,你陷入了网络中,因为具有讽刺意味的是,这个错误保护了你之前不会遇到这个问题。
这样做:
将文件的所有者配置为 NSObject。
不要将文件所有者的任何插座连接到笔尖中的视图;如果有这样的出路,删除它。
使用nil
所有者加载笔尖,就像您正在做的那样。
(准备好了吗?这是关键:)重命名笔尖。不要称它为 TipView.xib。这个名字是导致你一直试图解决的整个问题的原因。比如说,TipViewNib.xib。相应地修改您的代码,即使用 nibName: "TipViewNib"
加载 nib。
清除所有缓存,包括模拟器版本(我在此解释:How to Empty Caches and Clean All Targets Xcode 4)以摆脱坏笔尖(名称为 TipView.xib 的笔尖)。 p>
然后你的问题就会像晨雾一样消失。
【讨论】:
感谢@matt 的输入。这实际上并没有为我解决。但我相信它会为其他人解决它。 我确信我说的是对的。请注意,您可能需要在此操作之前清除所有缓存,以便摆脱“坏”笔尖(具有 TipView 名称的笔尖)。请参阅***.com/questions/5714372/… 如果这不起作用,您可以在 github 上至少发布项目的相关部分吗?我会为你修好它。 添加了清除缓存的步骤。这很关键。你用这个笔尖的名字真的把事情搞砸了,要拧开它们需要一些工作。 射击。对不起。你是 100% 正确的。我清除了 derivedData 并简单地更改了 nib 名称允许它编译没有错误。多么疯狂的错误!你有一个我可以欺骗的开放雷达吗? 现在不是错误了。这是 iOS 8 中的一个错误。该错误已关闭 - 它已在 iOS 9 中修复。以上是关于尝试以编程方式加载笔尖,接收 Xcode 6 中未遇到的无数错误的主要内容,如果未能解决你的问题,请参考以下文章
当我以编程方式从情节提要加载窗口时,为啥在 NSView 中未调用 drawRect?