尝试以编程方式加载笔尖,接收 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 的笔尖) =]).

你的烦恼会像晨雾一样烟消云散。