Swift OSX-从另一个类和线程更新NSTextView
我是Swift编程的新手,我的背景一直都是过程语言,所以我开始接受该语言和一些OO概念 我正在构建一个OSX应用程序,它有一个GUI窗口,有两个输入字段和一个按钮-当单击按钮时,程序会从其中一个文本框中输入的文件夹中获取图像文件,并将其复制到第二个文本框中输入的文件夹中。在这个主窗口上,我们可以看到一个NSTextView,它充当输出日志,以便用户知道副本的进度Swift OSX-从另一个类和线程更新NSTextView,swift,multithreading,user-interface,Swift,Multithreading,User Interface,我是Swift编程的新手,我的背景一直都是过程语言,所以我开始接受该语言和一些OO概念 我正在构建一个OSX应用程序,它有一个GUI窗口,有两个输入字段和一个按钮-当单击按钮时,程序会从其中一个文本框中输入的文件夹中获取图像文件,并将其复制到第二个文本框中输入的文件夹中。在这个主窗口上,我们可以看到一个NSTextView,它充当输出日志,以便用户知道副本的进度 ViewController.swift utilities.swift ImageCopy.swift 这3个控件在我的View
ViewController.swift
utilities.swift
ImageCopy.swift
这3个控件在我的ViewController中定义
@IBOutlet var logView: NSTextView!
@IBOutlet weak var sourceFolder: NSTextField!
@IBOutlet weak var targetFolder: NSTextField!
按钮代码为:
@IBAction func ExecuteButtonPressed(_ sender: NSButtonCell){
utilities.writeToLog(lineOfText: "Copy process starting\n")
processImages(inputFolder, outputFolder) // <-- This can take some time
utilities.writeToLog(lineOfText: "Copy process ended\n")
}
所有复制功能都位于ImageCopy.swift文件中,并使用writeToLog()函数在GUI控件运行时尝试写入
应用程序都在一个异常情况下工作-因为ProcessImages()函数可能需要很长时间,而且据我所知,它在主线程上运行,它会阻止GUI更新,因此一旦ProcessImages()函数返回logView NSTextView更新,所有更新都会立即执行
我想我需要在线程上运行ProcessImages()函数,但是当我这样做时,它仍然没有更新日志视图
任何帮助都将不胜感激
**************************************更新
我想我现在走的路是对的。我正在调查代理和通知,以便在后台线程和UI视图之间进行通信。******************************************更新
我想我现在走的路是对的。我正在调查代理和通知,以便在后台线程和UI视图之间进行通信。要使您自己的答案对其他与您相同的人有用,您应该通过示例或文档链接进行扩展。:)
class utilities{
static func writeToLog(lineOfText: String){
// Get current viewcontroller where the logview textview is
let vc = (NSApplication.shared.keyWindow?.contentViewController as! ViewController)
let calendar = Calendar.current
let time=calendar.dateComponents([.hour,.minute,.second], from: Date())
let outputLineOfText = "\(time.hour!):\(time.minute!):\(time.second!) - " + lineOfText
vc.logView.textStorage?.append(NSAttributedString(string: outputLineOfText))
vc.logView.scrollToEndOfDocument(self)
}