gpt4 book ai didi

ios - Swift Delegate 在自己的类中

转载 作者:搜寻专家 更新时间:2023-11-01 06:44:49 27 4
gpt4 key购买 nike

我目前正在尝试编写我的第一个 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 调用委托(delegate)方法的位置?准确地说:如何将第一个类重构为两个不同的类?

最佳答案

想想这一行的内存管理:

let testClass = TestClass(syntaxParser: self.syntaxParser!, textView: self.codeTextView)

testClass 是一个局部变量。那么你全新的 TestClass 实例会发生什么?当 viewDidLoad 结束时,它出现并立即消失在一阵烟雾中

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

解决方案:使 testClass 能够持久足够长的时间来给你带来一些好处——比如,你的 View Controller 的一个实例属性。这将为您提供准确的重构(这是标准设计模式)。

关于ios - Swift Delegate 在自己的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com