Swift OSX - обновить NSTextView из другого класса и, возможно, потока - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в программировании на Swift, и мой опыт всегда был процедурными языками, поэтому я прихожу к соглашению как с языком, так и с некоторыми концепциями ОО.

Я создаю приложение OSX с 1 графическим интерфейсомокно, с 2 полями ввода и кнопкой - при нажатии кнопки программа берет файлы изображений из папки, введенной в 1 из текстовых полей, и копирует их в папку, введенную во втором текстовом поле.В этом главном окне используется NSTextView, который действует как выходной журнал, поэтому пользователь знает ход выполнения копий.

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")
} 

в utilities.swift Функция writeToLog определяется как:

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)

}

Все функции копирования находятся в файле ImageCopy.swift и используют writeToLog ()функция для попытки записи в элемент управления GUI в процессе его выполнения.

Все приложение работает с одним исключением - функция ProcessImages () может занимать так много времени и, насколько я понимаю, работает на главномон блокирует обновления GUI, поэтому, как только функция ProcessImages () возвращает обновления logView NSTextView, все сразу.

Я думаю, что мне нужно запустить функцию ProcessImages () в потоке, однако, когда я это сделалвсе еще не обновлял logView.

Любая помощь будет высоко ценится.

************************************** ОБНОВЛЕНИЕ

Я думаю, что сейчас на правильном пути.Я изучаю делегатов и уведомления для связи между фоновым потоком и представлением пользовательского интерфейса.

1 Ответ

0 голосов
/ 24 мая 2018

************************************** ОБНОВЛЕНИЕ

Я думаюЯ сейчас на правильном пути.Я изучаю делегатов и уведомления для связи между фоновым потоком и представлением пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...