Правильная программная установка ограничений с редактируемым NSTextField в NSGridView - PullRequest
0 голосов
/ 10 января 2019

Я играю с прототипом, который даст возможность иметь простую расширяемую форму, где вы можете добавлять / вычитать столбцы на лету, где все ячейки доступны для редактирования. Я рассматриваю 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 и отказаться от индивидуального выбора ячеек, так как мне действительно нужно, чтобы они были редактируемыми, но я бы предпочел хотя бы знать, может ли это решение работать, прежде чем отказаться от него.

(А) enter image description here

(В) enter image description here

(С) enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...