如何从Swift中的文件刷新数组的内容?

时间:2019-05-14 18:42:22

标签: arrays swift macos

我正在Swift中构建一个菜单应用程序,以从日志文件中读取最新行。我可以将日志加载到数组中,但需要刷新,最好自动刷新。如何获取它以刷新阵列?然后如何触发该事件自动发生?

该应用程序是一个菜单项。单击它时,将出现一个带有文本字段的窗口,其中显示logList数组中的最后一个条目。 logList.init函数位于viewDidLoad函数中。我尝试将其移至viewWillLoad,并且没有任何变化。我尝试过在类中使用.init函数进行声明,然后在更新文本字段的原始声明中使用viewDidLoaddidset中进行重做。仍然只在第一次打开时加载。

变量声明:

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变量的内容,但事实并非如此。除非我退出我的应用程序并重新打开它,否则变量永远不会改变。

2 个答案:

答案 0 :(得分:0)

听起来您的目标是viewWillAppear,而不是viewDidLoad

我不确定我了解您所描述的确切流程,但是viewDidLoad在视图控制器的生命周期中仅发生一次,因此可能是将logList代码移至{{1 }}就能解决问题。

有关更多信息,请参见Apple's UIViewController documentation.中的“处理与视图相关的通知”

答案 1 :(得分:0)

viewDidLoad仅被调用一次,除非您在关闭窗口后显式取消分配视图控制器。

至少有3个选项:

  1. 将代码放入viewWillAppear中。
  2. 扩展NSStatusBarButton,覆盖mouseDown并将数据加载到那里。
  3. 采用NSMenuDelegate,连接菜单并将数据加载到menuWillOpen中。