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.
中完成了所有委托/数据源功能
我刚刚开始处理我的第一个 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.
中完成了所有委托/数据源功能