Ios 在自己的班级中迅速委派

Ios 在自己的班级中迅速委派,ios,swift,textkit,Ios,Swift,Textkit,我目前正在尝试编写我的第一个Swift Mac应用程序。目前,我很难将一些代码重构到另一个类中 当前状态: import Cocoa class TestClass: NSObject, NSTextStorageDelegate { @IBOutlet var codeTextView: NSTextView! var syntaxParser:TRexSyntaxKitParser? var textStorage : NSTextStorage! ini

我目前正在尝试编写我的第一个Swift Mac应用程序。目前,我很难将一些代码重构到另一个类中

当前状态:

import Cocoa

class TestClass: NSObject, NSTextStorageDelegate {

    @IBOutlet var codeTextView: NSTextView!
    var syntaxParser:TRexSyntaxKitParser?
    var textStorage : NSTextStorage!
    init(syntaxParser:TRexSyntaxKitParser, textView:NSTextView) {
        self.syntaxParser = syntaxParser

        super.init()

        if let textViewStorage = textView.textStorage {
            self.textStorage = textViewStorage
            self.textStorage.delegate = self
        }
    }

    func textStorageDidProcessEditing(notification: NSNotification) {
        let inputString = self.textStorage.string
        let wholeRange = NSMakeRange(0, count(inputString))

        self.textStorage.removeAttribute(NSForegroundColorAttributeName, range:wholeRange)

        let attributes = self.syntaxParser!.parse(inputString)
        print("Attributes: \(attributes)")

        for attribDict: [String:AnyObject] in attributes {

            let range = NSMakeRange(attribDict["rangeStart"] as! Int, attribDict["rangeLength"] as! Int)
            self.textStorage.addAttribute(attribDict["attributeKey"] as! String, value:NSColor(hexString: attribDict["color"] as! String)!, range:range)
        }
    }
}
这就是我对这门课的称呼:

import Cocoa

class CodeEditorViewController: NSViewController {

    @IBOutlet var codeTextView: NSTextView!
    var syntaxParser:TRexSyntaxKitParser?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.syntaxParser = TRexSyntaxKitParser(language:"latex",theme:"classic")
        let testClass = TestClass(syntaxParser: self.syntaxParser!, textView: self.codeTextView)
        codeTextView.lnv_setUpLineNumberView()
    }
但这会产生以下错误:

[NSFont textStorageDidProcessEditing:]: unrecognized selector sent to instance 
我不知道从NSFont在哪里调用委托方法?
准确地说,如何将第一个类重构为两个不同的类?

思考一下这一行的内存管理:

let testClass = TestClass(syntaxParser: self.syntaxParser!, textView: self.codeTextView)
testClass
是一个局部变量。那么,您的全新TestClass实例会发生什么变化?当
viewDidLoad
结束时,它开始存在并立即消失在一股烟雾中

因此,现在有一个委托指向不存在的对象。因此,崩溃


解决方案:使
testClass
成为能够持续足够长时间的东西,从而为您带来一些好处,比如视图控制器的实例属性。这将为您提供所需的重构(这是一种标准设计模式)。

“这产生了”是什么产生了它?您还没有显示任何证据表明您曾经创建过TestClass实例。但如何做到这一点至关重要。展示它。显示您当前的重构代码(旧代码一点也不感兴趣;如果您愿意,您可以从问题中删除旧代码)。顺便说一下,只需跳到关键点,您就犯了内存管理错误。发生的事情是,您正在设置一个委托,然后该委托将不存在。我们需要找出原因。你可以通过打开僵尸来计算出这到底是什么时候发生的。好的,谢谢。我根据你的评论编辑了我的答案。我将看一看仪器中的NSZombies。看起来好多了,谢谢你的重写。这个问题的答案现在对我来说是显而易见的!我会给你写个简短的答复。