NSTableView 根本没有出现

NSTableView not appearing at all

我刚刚开始处理我的第一个 macOS 项目,但在设置 NSTableView 时遇到了问题。当我 运行 它会出现 window 但里面什么也没有。我已经确保所有 objects 在身份检查器中都有正确的 class 并且似乎无法找到我做错了什么。

该应用程序的目标是制作一个笔记应用程序。我想要一个 table 视图,它在单个列中显示数据库中所有注释的标题,因此当您单击该单元格时,该注释将显示在 window 的其余部分中。

代码如下:

import Foundation
import AppKit
import SQLite

class NoteCloudVC: NSViewController {
    // Declare an array of Note objects for populating the table view
    var notesArray: [Note] = []
    // IBOutlets
    @IBOutlet weak var tableView: NSTableView!
    // ViewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        // set the tableViews delegate and dataSource to self
        tableView.delegate = self
        tableView.dataSource = self
        //Establsih R/W connection to the db
        do {
            let path = NSSearchPathForDirectoriesInDomains(
                .applicationSupportDirectory, .userDomainMask, true
            ).first! + "/" + Bundle.main.bundleIdentifier!
            // create parent directory iff it doesn’t exist
            try FileManager.default.createDirectory(
                atPath: path,
                withIntermediateDirectories: true,
                attributes: nil
            )
            let db = try Connection("\(path)/db.sqlite3")
            //Define the Notes Table and its Columns
            let notes = Table("Notes")
            let id = Expression<Int64>("ID")
            let title = Expression<String>("Title")
            let body = Expression<String>("Body")  
            /*
             Query the data from NotesAppDB.sqlite3 into an array of Note objs
             Then use that array to populate the NSTableView
             */
            for note in try db.prepare(notes) {
                let noteToAdd = Note(Int(note[id]), note[title], note[body])
                notesArray.append(noteToAdd)
            }
        } catch {
            print(error)
        }
    }
    // viewWillAppear
    override func viewWillAppear() {
        super.viewWillAppear()
        tableView.reloadData()
    }
}

// NSTableViewDataSource Extension of the NoteCloudVC
extension NoteCloudVC: NSTableViewDataSource {
    // Number of rows ~ returns notesArray.count
    func numberOfRows(in tableView: NSTableView) -> Int {
        return notesArray.count
    }
}

// NSTableViewDelegate extension of the NoteCloudVC
extension NoteCloudVC: NSTableViewDelegate {
    // Configures each cell to display the title of its corresponding note
    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        //configure the cell
        if tableColumn?.identifier == NSUserInterfaceItemIdentifier(rawValue: "NotesColumn") {
            
            let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "NotesCell")
            guard let noteCell = tableView.makeView(withIdentifier: cellIdentifier, owner: self) as? NotesCell else { return nil }
            
            let note = notesArray[row]
            noteCell.noteTitle.stringValue = note.title
            
            return noteCell
        }
        return nil
    }
}

// NotesCell class
class NotesCell: NSTableCellView {
    // IBOutlet for the title
    @IBOutlet weak var noteTitle: NSTextField!
}

我对 UIKit 非常熟悉,所以我认为 AppKit 的学习曲线会比 SwiftUI 好一点,所以如果有人能提供一些关于我哪里出错的指导,我将不胜感激。另外,如果能更好地利用我的时间转向 SwiftUI,请 lmk。


这是调试时的值:

它正在正确读取 table 中的值,所以我至少知道问题出在 tableView 函数中。

最令人困惑的部分是 header 甚至没有出现。这就是我 运行 时看到的全部内容:


这里还有我的故事板的一些图片:

这是我的软件建模和设计作业 class,我的教授实际上什么也没教。所以我非常感谢所有帮助解决这个问题的人,因为你们基本上都是我的“教授”class。当我将 tableView 移动到故事板中视图控制器的中心时,我可以看到列的最右边缘有一个小破折号,但就是这样,如果没有这个 table查看,因为整个应用程序都依赖于它。

所以,事实证明代码本身并不是真正的问题。在为 iOS 编写内容时,我一直使用基本的 swift 文件,所以我从来没有想过我需要导入 Cocoa 才能使用 AppKit,但这就是问题一直存在的地方。在导入了 Cocoa 的 auto-generated ViewController class 中使用此代码就可以了。我也摆脱了扩展,只是在 viewController class.

中完成了所有委托/数据源功能