【问题标题】:OS X addsubview from xib in swiftswift中来自xib的OS X addsubview
【发布时间】:2014-12-01 12:24:32
【问题描述】:

我正在尝试使用 swift for OS X 从笔尖添加新的子视图。

到目前为止,我已经:

  • 创建了一个新的“Cocoa 应用程序”
  • 添加了一个名为“TestSubView”的新“Cocoa 类”作为带有 XIB 文件的 NSViewController 的子类

我想在应用程序加载时将此子视图添加到我的主视图中。

在我的 ViewController(主窗口的 ViewController)中。

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let newSubView = TestSubView();
        self.view.addSubview(newSubView.view);

    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

但我收到以下错误

Failed to set (contentViewController) user defined inspected property on (NSWindow): 
-[NSNib initWithNibNamed:bundle:] could not load the nibName: temp.TestSubView in bundle (null).

我意识到我需要调整这个子视图的大小和位置,但我似乎无法做到这一点。

我花了一天的大部分时间试图弄清楚这一点,所以任何帮助都将不胜感激。

【问题讨论】:

    标签: xcode macos cocoa swift nsviewcontroller


    【解决方案1】:

    我终于让这件事起作用了。我的新代码看起来像

    import Cocoa
    
    class ViewController: NSViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let subview = TestSubView(nibName: "TestSubView", bundle: nil)!
            self.view.addSubview(subview.view)
        }
    
        override var representedObject: AnyObject? {
            didSet {
            // Update the view, if already loaded.
            }
        }
    
    }
    

    the docs & this answer 的帮助下找到

    建议如果 nib 名称和类名相同,则不需要声明 nibname:(正如我最初尝试做的那样),但文档没有提到这一点 - 解释了为什么没用!

    为了繁荣,这对我在 OS X Yosemite (10.10.1) 上使用 Xcode 6.1.1 有效

    【讨论】:

      【解决方案2】:

      nib 实际上只是一个包含视图信息的 XML 文件。您必须从应用程序包中获取它并明确获取其中包含的视图之一。您可能混淆了视图和视图控制器(您尝试从 newSubView 中提取 view 表明了这一点)。

      试试这个:

      let subview = NSBundle.mainBundle().loadNibNamed("TestSubView", 
         owner:self, options:nil)![0]! // maybe no final unwrapping "!" in Swift 3
      self.view.addSubview(subview)
      

      确保 xib 确实被称为您正在使用的名称,并且至少包含一个视图(否则上面的两个展开 ! 将使您的应用程序崩溃)。

      【讨论】:

      • 我得到“后缀的操作数'!'应该有可选类型;类型是 'Bool'" - 当你说要确保 xib 真的被称为名称时 - 文件名是 "TestSubView.swift TestSubView.xib" 我需要在某处和一个标识符吗?
      • 不需要标识符。
      • @Josh 自 Swift 语言的最后一次修订以来,这可能不再有效(注意这篇文章的日期)。
      • 删除最后一个后这对我有用! [0] 之后 - xcode 7.3, swift 2.2
      • 我没有看到 loadNibNamed:owner:options 方法,但我看到了 loadNibNamed:owner:topLevelObjects 方法,它返回一个布尔值(所以我无法获得它的索引 0 并且不知道如何使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多