2017-05-27 69 views
1

我正在嘗試開發一款應用程序,該應用程序包含一個StoryBoard,其中包含一個用於記錄應用程序事件和用戶反饋的NSTextView。我從主視圖中的複選框切換加載視圖(控制檯日誌視圖在應用程序啓動時默認打開)。所有這些都可以在應用程序啓動時正常工作,第二個視圖可以像viewDidLoad()函數一樣處理文本。NSTextView/NSViewController NSNotification用於SWIFT中的MacOS應用程序的控制檯日誌功能

爲控制檯日誌視圖的NSViewController類是:

class ConsoleLogViewController: NSViewController,NSTextViewDelegate { 

@IBOutlet var textViewConsoleLog: NSTextView! 

override func viewWillDisappear() { 
    (representedObject as! NSButton).isEnabled = true 
    (representedObject as! NSButton).state = NSOffState 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do view setup here. 

    textViewConsoleLog.delegate = self 
    textViewConsoleLog.string = "All new journal events are logged to this window" 
    textViewConsoleLog.string?.append("\n") 
    textViewConsoleLog.string?.append("*********************************************") 
    textViewConsoleLog.string?.append("\n") 
    textViewConsoleLog.string?.append("\n") 
} // END OF viewDidLoad() 


func addLogToConsoleWindow(newLogEntry: String) { 
    textViewConsoleLog.string? = (newLogEntry) 
    textViewConsoleLog.string?.append("\n") 
} // END OF addLogToConsoleWindow() 

} // ConsoleLogViewController

OF END

的視圖是從主視圖控制器(下圖中命名爲 '控制')啓動使用以下函數調用:

func showConsoleLogView() { 
    let buttonCall = chkBoxConsoleLog 
    performSegue(withIdentifier: "sequeConsoleView", sender: buttonCall) 
} // END OF showConsoleLogView() 

在主視圖控制器中,我創建一個ConsoleLogViewController實例,然後嘗試使用函數addLogToConsoleWindow將附加日誌信息附加到textViewConsoleLog。代碼在主視圖控制器相關的片段是:

let consoleOutputPrintStatement = ConsoleLogViewController() // Create an instance of ConsoleLogViewController to allow logging to the new console window 

consoleOutputPrintStatement.addLogToConsoleWindow(newLogEntry: "Loading journal files") 

然而,當我運行的應用程序,並嘗試寫附加文本行,我收到了fatal error: unexpectedly found nil while unwrapping an Optional value。很顯然,textViewConsoleLog對象爲零,並且正在創建錯誤。

我認爲問題在於我正在創建該類的另一個實例,因此我試圖將附加文本附加到尚未啓動的textViewConsoleLog對象(或類似的東西!)。

該應用程序是這樣的,當它第一次運行:

enter image description here

所以 - 我只是標題下錯了路試圖建立一個日誌記錄功能,使用NSTextView控制檯?或者我關閉了,但需要與NSTextView不同的方法才能使它工作?如何使用其他viewControllers生成的相關字符串更新NSTextField中的文本?

任何援助或指導高度讚賞。

+0

標題是關於'NSTextView'和日誌。問題是關於'NSViewController'。改變標題以吸引'NSViewController'專家。 – Willeke

+0

'我正在創建班級的另一個實例'呃,我錯過了那個部分。這很可能是問題的原因,是的。在這個新實例中,網點與任何事物都沒有關聯。 – Moritz

+0

是Eric - 但是,我如何寫入由segue創建的實例?作爲一個新手,我很困惑/不確定如何解決這個問題。 – Wolfstar

回答

0

好的 - 我終於整理出了一個使用NSNotification的解決方案 - 後見之明非常明顯。

控制檯日誌視圖中的相關代碼如下所示,該類設置爲使用addObserver方法從NotificationCenter接收通知。:

class ConsoleLogViewController: NSViewController,NSTextViewDelegate { 

@IBOutlet var textViewConsoleLog: NSTextView! 

let controlCentreDidSendConsoleNotification = "TCCEDJ.controlCentreDidSendConsoleNotification" 
let controlCentreDidSendConsoleNotificationMessageKey = "TCCEDJ.controlCentreDidSendConsoleNotificationMessageKey" 


override func viewWillDisappear() { 
    (representedObject as! NSButton).isEnabled = true 
    (representedObject as! NSButton).state = NSOffState 
} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    textViewConsoleLog.delegate = self 
    textViewConsoleLog.string = "All new journal events are logged to this window" 
    textViewConsoleLog.string?.append("\n") 
    textViewConsoleLog.string?.append("*********************************************") 
    textViewConsoleLog.string?.append("\n") 
    textViewConsoleLog.string?.append("\n") 

    // set up notification centre 
    let notificationCentre = NotificationCenter.default 
    notificationCentre.addObserver(self, selector: #selector(addLogToConsoleWindow), name: NSNotification.Name(rawValue: controlCentreDidSendConsoleNotification), object: nil) 
} // END OF viewDidLoad() 


@objc func addLogToConsoleWindow(newLogEntry: NSNotification) { 

    let userInfo = newLogEntry.userInfo as! [String: String] 
    let newLogEntryString = userInfo[controlCentreDidSendConsoleNotificationMessageKey]! 

    textViewConsoleLog.string?.append(newLogEntryString) 
    textViewConsoleLog.string?.append("\n") 
    textViewConsoleLog.scrollRangeToVisible(NSMakeRange((textViewConsoleLog.string?.characters.count)! - 1, 0)) 
} // END OF addLogToConsoleWindow() 

} // ConsoleLogViewController

年底

主視圖控制器相關的代碼是:

// Set up variables to use with notification centre 
let controlCentreDidSendConsoleNotification = "TCCEDJ.controlCentreDidSendConsoleNotification" 
let controlCentreDidSendConsoleNotificationMessageKey = "TCCEDJ.controlCentreDidSendConsoleNotificationMessageKey" 

let testLog = [controlCentreDidSendConsoleNotificationMessageKey: "Test log on button push"] 
    let notificationCentre = NotificationCenter.default 
    notificationCentre.post(name: NSNotification.Name(rawValue: controlCentreDidSendConsoleNotification), object: self, userInfo: testLog) 

所有現在工作與行爲我在尋找。

相關問題