尝试以编程方式加载笔尖,接收 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 中未遇到的无数错误的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建视图 VS。笔尖

当我以编程方式从情节提要加载窗口时,为啥在 NSView 中未调用 drawRect?

如何以编程方式将笔尖添加到 UIStackView

无法在 Xcode 中以编程方式创建地图(Big Nerd Ranch IOS 编程:第 6 章 p97)

Xcode,从情节提要中提取视图到笔尖,最好的方法?

如何使用 blob 服务以编程方式删除 Azure 存储中未提交的块?