textDidChange 指向错误的 NSCollectionViewItem
textDidChange points to the wrong NSCollectionViewItem
我正在尝试构建一个包含多个可编辑 TextView 的 NSCollectionView。 (OS Swift 中的 X 应用程序。)我的 NSCollectionViewItem 子类称为 NoteViewItem。我试图让程序检测其中一个 TextView 何时更改。我尝试在 NoteViewItem 的委托中同时使用 controlTextDidChange 和 textDidChange 以及测试打印语句,看看哪个可行。 ControlTextDidChange 什么也没做; textDidChange 意识到发生了变化,所以我同意了。
问题是 textDidChange 似乎指向一个 不同 NoteViewItem,而不是最初显示在屏幕上的那个。它无法识别原始 NoteViewItem 中设置的变量(称为 theNote);当我要求 NoteViewItem 打印 String(self) 时,我得到两种不同的结果,一种是在设置初始文本时,另一种是在 textDidChange 中。我想知道我是否错误地设置了代表和网点。关于为什么我的参考文献不在这里有什么想法吗?
这是我的 NoteViewItem 代码:
import Cocoa
class NoteViewItem: NSCollectionViewItem, NSTextViewDelegate
{
// MARK: Variables
@IBOutlet weak var theLabel: NSTextField!
@IBOutlet var theTextView: NSTextView!
var theNote: Note?
{
didSet
{
// Pre: The NoteViewItem's theNote property is set.
// Post: This observer has set the content of the *item's text view*, and label if it has one.
guard viewLoaded else { return }
if let theNote = theNote
{
// textField?.stringValue = theNote.noteText
theLabel.stringValue = theNote.filename
theTextView.string = theNote.noteText
theTextView.display()
print("theTextView.string set to "+theTextView.string!+" in NoteViewItem "+String(self))
}
else
{
theLabel.stringValue = "Empty note?"
}
}
}
// MARK: Functions
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
// Hopefully this will set the note's background to white.
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.whiteColor().CGColor
}
// MARK: - NSTextViewDelegate
/*
override func controlTextDidChange(notification: NSNotification)
{
print("Control text changed.")
}
*/
func textDidChange(notification: NSNotification)
{
if let noteyMcNoteface = theNote
{
print("On edit, we have a note: "+String(noteyMcNoteface))
}
else
{
print("On edit, we have no note. I am NoteViewItem "+String(self))
}
}
}
我明白了。我的代表在 TextView 中连接到 NoteViewItem.xib 的 Interface Builder 中的错误对象。我已将它连接到大纲中对象下标记为 Note View Item 的对象。它应该连接到 File's Owner,因为 File's Owner 代表与 xib 关联的 NoteViewItem.swift class。
你会认为如果你想将委托连接到 NoteViewItem class并且大纲中只列出了一个 Note View Item,那么注意 View Item 是您要将其连接到的东西。不,您将它连接到完全不同的东西,不叫 Note View Item 但是 Note View Item。我很高兴 Interface Builder 让事情变得如此简单。
我正在尝试构建一个包含多个可编辑 TextView 的 NSCollectionView。 (OS Swift 中的 X 应用程序。)我的 NSCollectionViewItem 子类称为 NoteViewItem。我试图让程序检测其中一个 TextView 何时更改。我尝试在 NoteViewItem 的委托中同时使用 controlTextDidChange 和 textDidChange 以及测试打印语句,看看哪个可行。 ControlTextDidChange 什么也没做; textDidChange 意识到发生了变化,所以我同意了。
问题是 textDidChange 似乎指向一个 不同 NoteViewItem,而不是最初显示在屏幕上的那个。它无法识别原始 NoteViewItem 中设置的变量(称为 theNote);当我要求 NoteViewItem 打印 String(self) 时,我得到两种不同的结果,一种是在设置初始文本时,另一种是在 textDidChange 中。我想知道我是否错误地设置了代表和网点。关于为什么我的参考文献不在这里有什么想法吗?
这是我的 NoteViewItem 代码:
import Cocoa
class NoteViewItem: NSCollectionViewItem, NSTextViewDelegate
{
// MARK: Variables
@IBOutlet weak var theLabel: NSTextField!
@IBOutlet var theTextView: NSTextView!
var theNote: Note?
{
didSet
{
// Pre: The NoteViewItem's theNote property is set.
// Post: This observer has set the content of the *item's text view*, and label if it has one.
guard viewLoaded else { return }
if let theNote = theNote
{
// textField?.stringValue = theNote.noteText
theLabel.stringValue = theNote.filename
theTextView.string = theNote.noteText
theTextView.display()
print("theTextView.string set to "+theTextView.string!+" in NoteViewItem "+String(self))
}
else
{
theLabel.stringValue = "Empty note?"
}
}
}
// MARK: Functions
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
// Hopefully this will set the note's background to white.
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.whiteColor().CGColor
}
// MARK: - NSTextViewDelegate
/*
override func controlTextDidChange(notification: NSNotification)
{
print("Control text changed.")
}
*/
func textDidChange(notification: NSNotification)
{
if let noteyMcNoteface = theNote
{
print("On edit, we have a note: "+String(noteyMcNoteface))
}
else
{
print("On edit, we have no note. I am NoteViewItem "+String(self))
}
}
}
我明白了。我的代表在 TextView 中连接到 NoteViewItem.xib 的 Interface Builder 中的错误对象。我已将它连接到大纲中对象下标记为 Note View Item 的对象。它应该连接到 File's Owner,因为 File's Owner 代表与 xib 关联的 NoteViewItem.swift class。
你会认为如果你想将委托连接到 NoteViewItem class并且大纲中只列出了一个 Note View Item,那么注意 View Item 是您要将其连接到的东西。不,您将它连接到完全不同的东西,不叫 Note View Item 但是 Note View Item。我很高兴 Interface Builder 让事情变得如此简单。