Swift 代表自己 class
Swift Delegate in own class
我目前正在尝试编写我的第一个 Swift Mac 应用程序。目前我很难将一些代码重构为另一个 class.
当前状态:
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)
}
}
}
这就是我的称呼 class:
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 调用委托方法的位置?
准确地说:如何将第一个 class 重构为两个不同的?
想想这一行的内存管理:
let testClass = TestClass(syntaxParser: self.syntaxParser!, textView: self.codeTextView)
testClass
是一个 局部变量 。那么你全新的 TestClass 实例会发生什么?它开始存在,当viewDidLoad
结束时立即消失在一阵烟雾中。
因此,您现在有一个指向不存在的对象的委托。因此,崩溃。
解决方案:制作 testClass
可以 持续 足够长的时间来为您带来好处的东西 - 例如,您的视图控制器的一个实例 属性。这将为您提供准确的重构(这是标准设计模式)。
我目前正在尝试编写我的第一个 Swift Mac 应用程序。目前我很难将一些代码重构为另一个 class.
当前状态:
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)
}
}
}
这就是我的称呼 class:
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 调用委托方法的位置? 准确地说:如何将第一个 class 重构为两个不同的?
想想这一行的内存管理:
let testClass = TestClass(syntaxParser: self.syntaxParser!, textView: self.codeTextView)
testClass
是一个 局部变量 。那么你全新的 TestClass 实例会发生什么?它开始存在,当viewDidLoad
结束时立即消失在一阵烟雾中。
因此,您现在有一个指向不存在的对象的委托。因此,崩溃。
解决方案:制作 testClass
可以 持续 足够长的时间来为您带来好处的东西 - 例如,您的视图控制器的一个实例 属性。这将为您提供准确的重构(这是标准设计模式)。