swift - 如何在 didSet 之后将数据从 AppDelegate 传递到 ViewController?

标签 swift macos delegates parameter-passing nstableview

我创建了一个 os X 项目并使用 Main Menu 打开文件目录并在 tableview 上显示内容。

在我的 AppDelegate.swift 中:

class AppDelegate: NSObject, NSApplicationDelegate {
    var filePath: String = String() {
        didSet {
            // Pass filePath to ViewController
        }
    }

    @IBAction func openFile(sender: AnyObject) {
        let myOpenDialog = NSOpenPanel()
        myOpenDialog.canChooseDirectories = true
        if(myOpenDialog.runModal() != 0) {
           self.filePath = myOpenDialog.URL!.path!
     }
}      

我的 ViewController.swift:

class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
    @IBOutlet weak var fileTableView: NSTableView!
    private var objects: NSMutableArray! = NSMutableArray()
    var fileDirectory: String = String() {
           didSet {
              showFileList(fileDirectory)
           }
    }
    func showFileList(fileDirectory: String) {
    var contentsInFolder: NSArray?
    var isDir : ObjCBool = false

    // Remove last loaded objects
    self.objects.removeAllObjects()

    if NSFileManager.defaultManager().fileExistsAtPath(fileDirectory, isDirectory:&isDir) {
        if isDir {
            contentsInFolder = try! NSFileManager.defaultManager().contentsOfDirectoryAtPath(fileDirectory)
            for id in contentsInFolder! {
                if ((id as! String).rangeOfString(".MOV") != nil) {
                    self.objects.addObject(id)
                }
            }
        }
    }
        self.fileTableView.reloadData()
    }

    // MARK: - Table View
    func numberOfRowsInTableView(tableView: NSTableView) -> Int
    {
        return self.objects.count
    }
}

当我在 ViewController.swift 中运行 self.fileTableView.reloadData() 时,出现错误“ fatal error :在展开可选值时意外发现 nil”。知道如何解决吗?

var vc = ViewController()
var filePath: String = String() {
    didSet {
        vc.fileDirectory = filePath
    }
}

最佳答案

showFileList 作为 ViewController 初始化过程的一部分被调用时,fileTableView 和您的 UITableView 之间的连接> 在 View 中尚未设置。因此,执行self.fileTableView.reloadData()时为nil

在调用reloadData之前简单地检查nil:

 if(self.fileTableView != nil) self.fileTableView.reloadData()

附带说明一下,您可能也应该为 self.objects 执行此操作。我猜 self.objects 总是在 self.fileTableView 之前初始化,因为它是在之前声明的,但我不知道它是否在 Swift 规范中记录了行为(如果知道这方面的人可以参与,将不胜感激)。

关于swift - 如何在 didSet 之后将数据从 AppDelegate 传递到 ViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34036793/

相关文章:

swift - Swift 中的 var 和 weak var 有什么区别

ios - Swift 3/自 "Value of type Any has no member value"以来如何处理嵌套的 NSDictionaries

ios - 委托(delegate)如何知道在有多个一致性的地方调用函数

java - 有没有办法在 Mac 中以 headless 方式运行 GUI 应用程序?

C# GC 委托(delegate)?

c# - 如何使用反射创建基于 lambda 的委托(delegate)?

swift - 境界 0.99 Swift 让境界 = 试试! Realm ()

swift - Swift 中的定向碰撞检测

windows - 使用 Lazarus 为 Mac 编写代码

macos - NSOutlineView 渐变背景