向NSArrayController添加项目会导致EXC_BAD_INSTRUCTION

时间:2018-08-14 22:20:49

标签: swift xcode tableview

几天来我遇到了同样的问题,这一直在杀了我。每当我运行脚本时,我都会得到一个EXC_BAD_INSTRUCTION。当我将对象数组添加到NSTableController时,就会发生这种情况。下面是我的代码:

AppDelegate.swift:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

@IBOutlet weak var window: NSWindow!

@IBOutlet weak var mainTabView: NSTabView!

@IBOutlet weak var tracksAC: NSArrayController!
@IBOutlet weak var albumsAC: NSArrayController!

func checkIfFileExists(atPath path: String, isDirectory: Bool = false, createIfNeeded createNew: Bool = false) -> Int {
    var isDir: ObjCBool = ObjCBool(isDirectory)

    if !FileManager.default.fileExists(atPath: path, isDirectory: &isDir) {
        if createNew {
            do {
                if isDirectory {
                    try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true)

                }else{
                    FileManager.default.createFile(atPath: path, contents: nil)

                }

                return 2

            }catch{
                return 3

            }
        }else{
            return 0

        }
    }

    return 1
}

func applicationDidFinishLaunching(_ aNotification: Notification) {
    //Create application support folder if it's not existent and populate with all needed files
    let paths = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)
    let appSupportDir = paths[0] + "/Project Alpha"

    //Create application folder if needed
    let folderStatus = checkIfFileExists(atPath: appSupportDir, isDirectory: true, createIfNeeded: true)

    if folderStatus == 1 || folderStatus == 2 {
        _ = checkIfFileExists(atPath: appSupportDir + "/Songs.txt", createIfNeeded: true)
        _ = checkIfFileExists(atPath: appSupportDir + "/Albums.txt", createIfNeeded: true)
        _ = checkIfFileExists(atPath: appSupportDir + "/Genres.txt", createIfNeeded: true)
    }

    //Populate tracks table view
    let tracks = getTracks()

    print(tracks[0].name)

    tracksAC.add(contentsOf: tracks) //This is where the error occures every time
}

func applicationWillTerminate(_ aNotification: Notification) {
    // Insert code here to tear down your application
}

@IBAction func openAlbumsTab(_ sender: NSToolbarItem) {
    mainTabView.selectTabViewItem(at: 1)
}


}

Classes.swift:

import Cocoa

class Track: NSObject {
func getLine() -> String? {
    let songsFilePath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)[0] + "/Project Alpha/Songs.txt"
    do {
        let content = try String(contentsOfFile: songsFilePath)

        let lines = content.components(separatedBy: "---===---")

        let line = lines.first(where: {$0.hasPrefix(String(self.identifier) + ";")})
        return line
    }catch{
        return nil
    }
}

var identifier: Int

var name: String
var artist: String
var album: String
var genre: String
var vocals: String
var trackNumber: Int


init(line: String) {
    let items = line.components(separatedBy: ";")

    print(items)

    self.identifier = Int(items[0])!
    self.name = String(items[1])
    self.artist = String(items[2])
    self.genre = String(items[3])
    self.vocals = String(items[4])
    self.album = String(items[5])
    self.trackNumber = Int(items[6])!

}
}

我已经检查了getTracks函数,通常它确实返回Track对象的列表,所以我真的不知道是什么原因导致了错误。这些列绑定到阵列控制器,如下面的链接所示: screenshot

任何帮助将不胜感激。预先感谢。

0 个答案:

没有答案