【问题标题】:Where to ctrl-drag IBOutlets, view class or ViewController?在哪里 ctrl-drag IBOutlets、视图类或 ViewController?
【发布时间】:2019-09-30 23:40:22
【问题描述】:

我对编码很陌生。我不确定从 xib 中 ctrl 拖动的 IBOutlet(按钮、文本字段等)是否应该进入 xib 的 NSView 类或将 NSView 添加为子视图的视图控制器中。

我玩这个已经有一段时间了,边走边学。我一直想知道我的代码结构是否正确。这适用于 MacOS,因此资源有限且经常过时。例如,我假设为按钮添加的插座将进入控制器,因为视图应该是“哑的”。如果我尝试让这些动作始终自动设置“动作”并默认输入任何类型 - 而不是我习惯看到的。我怀疑这可能与为文件所有者设置的类和为 IB 中的视图设置的类有关。如果有人能概述处理此问题的最佳方法,那就太好了,谢谢!

加载 xib 的视图:

class View4: NSView {

@IBOutlet weak var view: View4!

override init(frame frameRect: NSRect) {

    super.init(frame: frameRect)

    Bundle.main.loadNibNamed("View4", owner: self, topLevelObjects: nil)

    self.frame = self.bounds

    self.wantsLayer = true
    self.translatesAutoresizingMaskIntoConstraints = false
    self.layer?.backgroundColor = NSColor.purple.cgColor
    self.roundedCorners(on: self)
    // add xib to custom NSView subclass
    self.addSubview(self.view)

}

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

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)

    // Drawing code here.
}
}

对应的ViewController:

class View4Controller: NSViewController {

override func loadView() {

    print("View4Controller.loadView")
    self.view = NSView()
    }

override func viewDidLoad() {
    super.viewDidLoad()
     // Do view setup here.

    print("View4Controller.viewDidLoad")
    self.view = View4()
}
}

【问题讨论】:

    标签: swift macos nsview nsviewcontroller


    【解决方案1】:

    插座的想法是引用在您创建的代码之外的对象。这个概念非常适合原型设计,但随着项目的发展,往往会变得难以管理。

    如果你的类是类,那么它可以引用自己。 (swift 中的“self”或 c++ 中的“this”)在这种情况下,您不需要插座。

    插座通常由需要维护视图的控制器使用。该概念是手动创建和配置视图的替代方案。

    【讨论】:

    • 感谢您的回复,非常有帮助。我应该让文件的所有者指向视图控制器而不是视图本身吗?此外,如果我 ctrl 将插座拖到控制器而不是视图中,我会收到“无法将(标签)插座从 (VC_Test.View4) 连接到 (NSTextField):缺少设置器或实例变量”错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多