我正在Swift中构建一个菜单应用程序,以从日志文件中读取最新行。我可以将日志加载到数组中,但需要刷新,最好自动刷新。如何获取它以刷新阵列?然后如何触发该事件自动发生?
该应用程序是一个菜单项。单击它时,将出现一个带有文本字段的窗口,其中显示logList
数组中的最后一个条目。 logList.init
函数位于viewDidLoad
函数中。我尝试将其移至viewWillLoad
,并且没有任何变化。我尝试过在类中使用.init
函数进行声明,然后在更新文本字段的原始声明中使用viewDidLoad
在didset
中进行重做。仍然只在第一次打开时加载。
变量声明:
public var logList = LogLine.init(logLocationSTRING: " ") {
didSet{
latestLog = logList.logLines[(logList.logLines.count)-2]
logLabel.stringValue = latestLog ?? "No logs found."
}
}
初始化:
override func viewDidLoad() {
super.viewDidLoad()
logList = LogLine.init(logLocationSTRING: "file:///some/log/file.log")
}
该结构采用文件URL的字符串值并将其转换为可用的URL,将日志的内容加载到变量中,然后将这些内容转换为每个行作为其单独项的数组。
我希望在关闭窗口并重新打开窗口之后,它应该重新调用.init函数并更新logList
变量的内容,但事实并非如此。除非我退出我的应用程序并重新打开它,否则变量永远不会改变。
答案 0 :(得分:0)
听起来您的目标是viewWillAppear
,而不是viewDidLoad
。
我不确定我了解您所描述的确切流程,但是viewDidLoad
在视图控制器的生命周期中仅发生一次,因此可能是将logList
代码移至{{1 }}就能解决问题。
有关更多信息,请参见Apple's UIViewController documentation.中的“处理与视图相关的通知”
答案 1 :(得分:0)
viewDidLoad
仅被调用一次,除非您在关闭窗口后显式取消分配视图控制器。
至少有3个选项:
viewWillAppear
中。NSStatusBarButton
,覆盖mouseDown
并将数据加载到那里。NSMenuDelegate
,连接菜单并将数据加载到menuWillOpen
中。