繁体   English   中英

textDidChange指向错误的NSCollectionViewItem

[英]textDidChange points to the wrong NSCollectionViewItem

我试图建立一个NSCollectionView充满了多个可编辑的TextViews。 (Swift中的OS 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中的错误对象。 我已将其连接到大纲中对象下方标记为“注释视图项目”的对象。 它应该已经连接到File的Owner,因为File的Owner代表与xib关联的NoteViewItem.swift类。

您可能会认为 ,如果要将委托连接到NoteViewItem类,并且大纲中仅列出了一个Note View Item,则该Note View Item是您想要将其连接到的对象。 不,你把它连接到完全不同的东西那不叫注意查看项目,但注意查看项目。 我很高兴Interface Builder使事情变得如此简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM