【问题标题】:Trying to load a nib programatically receiving myriad errors that weren't encountered in Xcode 6尝试以编程方式加载笔尖,接收 Xcode 6 中未遇到的无数错误
【发布时间】:2025-11-28 14:45:01
【问题描述】:

我提出了一个试图重用某些功能的旧项目。 我创建了一个带有 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 中我无法这样做 - 没有找到与更改相关的任何材料或发行说明,所以我我现在有点难过。

非常感谢任何帮助。

【问题讨论】:

    标签: ios xcode swift xcode7 nib


    【解决方案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 中修复。
    最近更新 更多