Я играю с прототипом, который даст возможность иметь простую расширяемую форму, где вы можете добавлять / вычитать столбцы на лету, где все ячейки доступны для редактирования. Я рассматриваю NSGridView как решение, так как мне нужно, чтобы все ячейки были легко редактируемыми / выбираемыми, что делает NSTableView несколько проблематичным.
Работая с некоторым примером кода, я обнаружил, что смог создать версию, которая ведет себя хорошо, используя NSTextField (labelWithString: String) (A), однако, когда я пытаюсь использовать NSTextField (string: String), вещи почти не работают и я вижу только один столбец, а не 3 (B).
Если я задаю ширину столбцов, я вижу все три, но затем я теряю возможность динамически изменять размер окна и настраивать сетку - что отлично работает с простыми метками (C)
Вот код, который у меня есть ... со всеми опциями (A), (B), (C), встроенными в код.
import Cocoa
class ViewController: NSViewController {
// let myTextField = NSTextField(frame: NSMakeRect(20,20,200,40))
@IBOutlet weak var myGridViewContainer: NSView!
var gridView:NSGridView = NSGridView()
func embed(superview: NSView, subview: NSView, autoresizing: Bool = false) {
superview.addSubview(subview)
subview.translatesAutoresizingMaskIntoConstraints = autoresizing
superview.addConstraint(NSLayoutConstraint(item: superview, attribute: .top, relatedBy: .equal,
toItem: subview, attribute: .top, multiplier: 1, constant: 0))
superview.addConstraint(NSLayoutConstraint(item: superview, attribute: .bottom, relatedBy: .equal,
toItem: subview, attribute: .bottom, multiplier: 1, constant: 0))
superview.addConstraint(NSLayoutConstraint(item: superview, attribute: .leading, relatedBy: .equal,
toItem: subview, attribute: .leading, multiplier: 1, constant: 0))
superview.addConstraint(NSLayoutConstraint(item: superview, attribute: .trailing, relatedBy: .equal,
toItem: subview, attribute: .trailing, multiplier: 1, constant: 0))
}
override func viewDidLoad() {
super.viewDidLoad()
/* */
// (A) These labels work just fine...
let lb1 = NSTextField(labelWithString: "Label1")
let lb2 = NSTextField(labelWithString: "Label2")
let lb3 = NSTextField(labelWithString: "Label3")
let lb4 = NSTextField(labelWithString: "Label4")
let lb5 = NSTextField(labelWithString: "Label5")
let lb6 = NSTextField(labelWithString: "Label6")
/* */
/*
// (B) However, using these you'll only see the first column as the field spans the whole view
let lb1 = NSTextField(string: "Label1")
let lb2 = NSTextField(string: "Label2")
let lb3 = NSTextField(string: "Label3")
let lb4 = NSTextField(string: "Label4")
let lb5 = NSTextField(string: "Label5")
let lb6 = NSTextField(string: "Label6")
*/
gridView = NSGridView(views:
[
[lb1, lb3, lb5],
[lb2, lb4, lb6]
])
// gridView.frame = myGridViewContainer.frame
gridView.column(at: 1).xPlacement = .center
/*
// (C) Adding these lines will get all cols to show w/editable fields, however the resize no longer works
gridView.column(at: 0).width = 80.0
gridView.column(at: 1).width = 80.0
gridView.column(at: 2).width = 80.0
*/
embed(superview: myGridViewContainer, subview: gridView)
}
override func viewWillAppear() {
myGridViewContainer.wantsLayer = true
myGridViewContainer.layer?.backgroundColor = NSColor.red.cgColor
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
Я могу просто выбрать движение к tableView и отказаться от индивидуального выбора ячеек, так как мне действительно нужно, чтобы они были редактируемыми, но я бы предпочел хотя бы знать, может ли это решение работать, прежде чем отказаться от него.
(А)

(В)

(С)
