textDidChange指向错误的NSCollectionViewItem

时间:2016-07-08 13:15:53

标签: swift macos cocoa nscollectionview

我正在尝试构建一个充满多个可编辑TextView的NSCollectionView。 (Swift中的OS X应用程序。)我的NSCollectionViewItem的子类称为NoteViewItem。我试图在其中一个TextView发生更改时检测程序。我尝试在NoteViewItem的委托中使用controlTextDidChange和textDidChange以及test print语句来查看哪些可行。 ControlTextDidChange什么都没做; textDidChange认识到发生了变化,所以我就这样做了。

问题是textDidChange似乎指向不同的 NoteViewItem,而不是首先在屏幕上显示的那个。它无法识别原始NoteViewItem中设置的变量(称为注意);当我要求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))
        }   
    }   
}

1 个答案:

答案 0 :(得分:0)

我明白了。我的委托在TextView中连接到Interface Builder for NoteViewItem.xib中的错误对象。我将它连接到标题为Note View Item的对象,在轮廓中的对象下。它应该已经连接到File的所有者,因为File的所有者代表与xib相关联的NoteViewItem.swift类。

认为如果您想将委托连接到NoteViewItem类并且大纲中只列出了一个Note View Item,那么Note View Item就是您的选择想把它连接到。不,你将它连接到完全不同的东西,不被称为注释视图项,但注释视图项。我很高兴Interface Builder让事情变得如此简单。