簡體   English   中英

Swift代表在自己的班級

[英]Swift Delegate in own class

我目前正在嘗試編寫我的第一個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 保持足夠長的時間來為你做一些好事 - 比如視圖控制器的實例屬性。 這將為您提供完全正在進行的重構(這是一種標准設計模式)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM