【问题标题】:Subclass of NSDatePicker mouseDown event changes datePicker instanceNSDatePicker mouseDown 事件的子类更改 datePicker 实例
【发布时间】:2020-03-02 04:01:29
【问题描述】:

我已经在 AppDelegate -> applicationDidFinishLaunching 中实例化并初始化了 NSDatePicker 的子类,并在 datePicker 子类中覆盖了 mouseDown(with event: NSEvent)。当我在 datePicker 中按下鼠标按钮并中断其覆盖的 mouseDown 函数时,该实例不是我在 applicationDidFinishLaunching 中实例化的实例,因此未初始化。

我尝试在不同的入口点创建实例,认为这可能是一个时间问题,但我一无所获。我没有想法,感觉有点虚弱。有什么帮助吗?

日期选择器:

import Cocoa

class AlarmIVDatePicker: NSDatePicker {
    var viewController: ViewController!

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
    }
    override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
        return true
    }
    override func mouseDown(with event: NSEvent) {
        let stop = 0
    }
}

视图控制器:

class ViewController: NSViewController, NSWindowDelegate{

var alarmIVDatePicker: AlarmIVDatePicker!


override func viewDidLoad() {
    super.viewDidLoad()

    alarmIVDatePicker = AlarmIVDatePicker()
    alarmIVDatePicker.viewController = self


}

我希望我可以访问我设置的值,但实例不是我创建的实例,所有值都是 nil

【问题讨论】:

  • 在 AppDelegate 中实例化日期选择器很奇怪。为什么不在实际使用它的任何视图或窗口控制器的viewDidLoadviewWillAppear 中实例化它?此外,您是否使用故事板或 xib 文件,您是否使用 IBOutlet 作为该日期选择器,或者您如何在视图中引用日期选择器?
  • 为什么在 AppDelegate 中我没有好的答案但同意,所以现在在 viewDidLoad 中实例化它: override func viewDidLoad() { super.viewDidLoad() alarmIVDatePicker = AlarmIVDatePicker() alarmIVDatePicker.viewController = self } 和使用 IBOutlet 引用它:@IBOutlet var alarmIVDatePicker: AlarmIVDatePicker!在 mouseDown 和它的 viewController 为 nil 之后,它不是同一个实例。
  • 您只需要使用IBOutlet,如果您将该插座连接到您的子类AlarmIVDatePicker 生活在故事板或XIB 文件中。您是否将其中一个用于该选择器所在的视图?
  • 不管我如何引用日期选择器,使用 IBOutlet 或声明类变量。只是想我没有提到日期选择器是带有步进器的文本,看不出有什么区别

标签: swift instance mousedown nsdatepicker


【解决方案1】:

好的。以下是您可以采取的措施来追踪这一点。将此代码添加到您的 AlarmIVDatePicker 类中:

override init(frame frameRect: NSRect) {
    Swift.print("AlarmIVDatePicker being called here")
    super.init(frame: frameRect)
}

convenience init() {
    self.init(frame: .zero)
}

required init?(coder: NSCoder) {
    Swift.print("hey, you DID drop this into a storyboard or XIB file!")
    super.init(coder: coder)
}

如果您在这些 init 方法中设置断点,您将在您未预料到的地方捕捉到它们被调用的时间和地点。

【讨论】:

  • 好的,谢谢,感觉有点不好意思; datepicker 被添加到带有情节提要的视图中,并被 IBOutlet 引用,但我通过在 viewDidLoad 中为该变量分配一个新实例来完成所有工作。逐步完成您提供的 inits 让我明白了,谢谢
  • 别担心,我真的很高兴你弄明白了!
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多