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 让事情变得如此简单。