gpt4 book ai didi

macos - 如何在Interface Builder中使用自定义NSView?

转载 作者:行者123 更新时间:2023-12-04 16:28:42 27 4
gpt4 key购买 nike

我看了很多关于如何在Interface Builder中创建自定义 View 的教程。都适用于iOS,但MacOS应该相似,不是吗?我尝试了几种方法,但没有一种是完全成功的。 init(coder:)调用NIB实例化(通过Bundle.main.loadNibNamedNSNib调用,如果我将 Nib 中的主 View 归类为自定义类,则又调用init(coder:)并以无限递归结束

如果我使用标准类,则使文件的所有者成为我的自定义类,该类效果更好,但仍然不正确。

有没有使用AppKit创建自定义控件的示例?我最接近的显示自定义控件,但是自动布局设置均无效。

它必须相当简单,但我还没有弄清楚。

这是我到目前为止的内容:

  • 新类MyControl

  • import Cocoa



    @IBDesignable
    class MyControl: NSView {



    @IBOutlet var customView: NSView!  // The top level NSView
    @IBOutlet weak var insideButton: NSButton! // The button inside the view

    let myName: String

    required init?(coder: NSCoder) {
    super.init(coder: coder)

    if Bundle.main.loadNibNamed("MyControl", owner: self, topLevelObjects: nil) {
    addSubview(customView)
    }
    }
    }
  • 基于NSView的 Nib 包含一个居中的NSButton。 File's Owner类设置为MyControl,顶级 View 保持为NSView
  • Main.storyboard具有一个自定义 View ,分类为MyControl,以高度和宽度为中心。

  • 当我查看Main.storyboard时,它具有用于自定义 View 的框架,但为空白。

    当我运行该应用程序时,显示的窗口为空白。

    最佳答案

    经过大量搜索和来自Apple支持的大量帮助,我发现在AppKit中创建和使用自定义控件非常容易。只是它就像锁中的 key ,除非您正确操作,否则将一无所获。

    我创建了一个示例项目,并将其发布到GitHub上:https://github.com/ctgreybeard/SwiftCustomControl

    这是一个小项目,我希望我已经对其进行了完整的评论,以便其他人可以理解它。

    该过程的要旨是这样的:

  • 在Interface Builder中创建一个XIB和一个NSView的子类。它们应该是相同的名称,但这不是必需的。
  • 对于XIB,将File's Owner的类更改为新类的名称。
  • 根据需要构建新的自定义控件。
  • 在您的类中包括一个IBOutlet,用于引用XIB中的顶级NSView。还包括您的控件需要的任何其他操作或导出。
  • 创建初始化程序required init?(coder: coder)
  • 在该初始值设定项中:
  • 使用let newNib = NSNib(nibNamed: myName, bundle: Bundle(for: type(of: self)))加载 Nib ,其中myName是XIB的名称。
  • newNib.instantiate(withOwner: self, topLevelObjects: nil)新的NSNib
  • 从旧的顶级NSView重新创建所有现有约束,并用self替换旧的NSView。在constraints属性的for循环中执行此操作。另外,您可以按照自己的意愿简单地创建约束。
  • 所有旧的顶级 self.addSubview
  • subviews这可以在旧NSView中的subviews数组上的for循环中轻松完成。
  • 应用您在上面创建的约束新数组。

  • 完成后,自定义控件现在应该正确显示在Interface Builder和应用程序中。

    评论:就这么简单,确实没有必要。我应该能够简单地在XIB的顶级NSView中使用我的自定义类名称,并完成此操作。 init中的代码只是用我们的自定义 View 替换该顶级NSView。

    关于macos - 如何在Interface Builder中使用自定义NSView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42143122/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com