Код для подключения NSbutton к методу загрузки NSView из Xib - PullRequest
0 голосов
/ 12 апреля 2019

Я работаю над своим первым приложением.У меня есть несколько NSButton-ов, которые я бы хотел подключить, чтобы каждая кнопка загружала отдельное подпредставление в существующий NSView.Я все еще довольно новичок в этом, и я борюсь с лучшим способом, чтобы закодировать это.

У меня есть класс для обработки действий кнопки, это просто показывает один для краткости:

class SelectorTest: NSObject {

@objc class func printButton1Pushed(_ sender: NSButton) {
print("button one pushed")

ContentView.showView1()

}
}

Вышеописанное работает нормально, строка выводится на консоль при нажатии кнопки.Это выдает ошибку «Результат вызова showView1 ()» не используется.Я предполагаю, что борюсь с тем, что добавить в метод showview1 () в классе ContentView.

У меня есть созданное представление, .xib и класс, называемые одним и тем же.Это прекрасно работает, если я добавлю в качестве подпредставления и запустить приложение.Как загрузить его при нажатии кнопки?Это код, который у меня есть, кнопка не загружает представление:

class ContentView: NSView {

static let cView = NSView()


class func showView1() -> NSView {

    let view1 = TestView()
    cView.addSubview(view1.view)
    return cView
}
}

Редактировать: Больше информации о проекте.У меня есть контроллер основного вида.В дополнение к этому в качестве подпредставления у меня есть NSStackview, включающее представление для кнопок слева и представление справа, где, как мы надеемся, будет отображаться каждое представление, вызванное NSButtons.

После небольшого прочтения я думаю, что «Результат вызова 'showView1 ()' не используется" означает ошибку: «Вы вызвали этот метод, он вернул NSView для вас, но вы нене используйте это ни для чего ".Я застрял в этой части, как мне обновить вид, чтобы показать только что созданный вид?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Вот, пожалуйста.(Сделал это вторым ответом, вместо того, чтобы редактировать мой предыдущий, потому что предыдущий уже достаточно длинный. Я все еще новичок здесь, и я надеюсь, что это не противоречит каким-либо правилам. Не пытаюсь поднять репутацию :)

Контроллер основного вида все еще генерируется из раскадровки.

Если это несколько многословно, я просто хотел показать все механизмы.Несомненно, есть много других способов сделать то же самое.



class ViewController: NSViewController {
// Initializing these objects here eliminates optionals
    let stackView = NSStackView(views: [makeView(.purple), makeView(.black)])
    let redButton = labeledButton("Red", action: #selector(showRed))
    let greenButton = labeledButton("Green", action: #selector(showGreen))
    let blueButton = labeledButton("Blue", action: #selector(showBlue))
// Action handlers are objective-c functions. @IBAction implies that
    @objc func showRed(_ sender: Any) {
        stackView.arrangedSubviews[1].layer?.backgroundColor = NSColor.red.cgColor
    }
    @objc func showGreen(_ sender: Any) {
        stackView.arrangedSubviews[1].layer?.backgroundColor = NSColor.green.cgColor
    }
    @objc func showBlue(_ sender: Any) {
        stackView.arrangedSubviews[1].layer?.backgroundColor = NSColor.blue.cgColor
    }
// Helper to make multiple buttons. Static so it can initialize instance properties
    class func labeledButton(_ stringValue: String = "", action: Selector) -> NSButton {
        let button = NSButton()
        button.action = action
        button.translatesAutoresizingMaskIntoConstraints = false
        button.bezelStyle = NSButton.BezelStyle.rounded
        button.title = stringValue
        return button
    }
// Helper to make multiple views. Also must be static
    class func makeView(_ color: NSColor) -> NSView {
        let vw = NSView()
        vw.translatesAutoresizingMaskIntoConstraints = false
        vw.wantsLayer = true
        vw.layer?.backgroundColor = color.cgColor
        return vw
    }

    private func createStackView() {
// Configure & add the stack view
        stackView.orientation = .horizontal
        stackView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(stackView)
// Pin it to the enclosing view
        stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        stackView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
// Set widths of subviews, and pin them to the stack view
        stackView.arrangedSubviews[0].widthAnchor.constraint(equalToConstant: 100).isActive = true
        stackView.arrangedSubviews[1].widthAnchor.constraint(greaterThanOrEqualToConstant: 300).isActive = true
        stackView.arrangedSubviews[0].topAnchor.constraint(equalTo: stackView.topAnchor).isActive = true
        stackView.arrangedSubviews[1].topAnchor.constraint(equalTo: stackView.topAnchor).isActive = true
        stackView.arrangedSubviews[0].bottomAnchor.constraint(equalTo: stackView.bottomAnchor).isActive = true
        stackView.arrangedSubviews[1].bottomAnchor.constraint(equalTo: stackView.bottomAnchor).isActive = true
 // Add the buttons to the left view
        stackView.arrangedSubviews[0].addSubview(redButton)
        stackView.arrangedSubviews[0].addSubview(greenButton)
        stackView.arrangedSubviews[0].addSubview(blueButton)
// Space them vertically, and center them horizontally
        redButton.centerXAnchor.constraint(equalTo: stackView.arrangedSubviews[0].centerXAnchor).isActive = true
        greenButton.centerXAnchor.constraint(equalTo: stackView.arrangedSubviews[0].centerXAnchor).isActive = true
        blueButton.centerXAnchor.constraint(equalTo: stackView.arrangedSubviews[0].centerXAnchor).isActive = true

        redButton.topAnchor.constraint(equalTo: stackView.arrangedSubviews[0].topAnchor, constant: 40).isActive = true
        greenButton.centerYAnchor.constraint(equalTo: stackView.arrangedSubviews[0].centerYAnchor).isActive = true
        blueButton.bottomAnchor.constraint(equalTo: stackView.arrangedSubviews[0].bottomAnchor, constant: -40).isActive = true

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        createStackView()
    }


}


0 голосов
/ 13 апреля 2019

Вот простой пример того, что я думаю (и, возможно, я ошибаюсь), что вы хотите сделать, используя раскадровку.Если вы предпочитаете делать что-то программно, это всего лишь несколько строк кода, но самый простой способ создать это IMO - это автоматическая разметка, которая может загромождать демонстрационный код.

import Cocoa

class ViewController: NSViewController {
    var stackedViews = [NSView]()

    @IBAction func showRed(_ sender: Any) {
        stackedViews[1].layer?.backgroundColor = NSColor.red.cgColor
    }
    @IBAction func showGreen(_ sender: Any) {
        stackedViews[1].layer?.backgroundColor = NSColor.green.cgColor
    }
    @IBAction func showBlue(_ sender: Any) {
        stackedViews[1].layer?.backgroundColor = NSColor.blue.cgColor
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        guard let sView = view.subviews[0] as? NSStackView else {
            print("No StackView")
            return
        }
        for v in sView.arrangedSubviews {
            stackedViews.append(v)
        }
        stackedViews[0].wantsLayer = true
        stackedViews[0].layer?.backgroundColor = NSColor.black.cgColor
        stackedViews[1].wantsLayer = true
        stackedViews[1].layer?.backgroundColor = NSColor.purple.cgColor
       // Do any additional setup after loading the view.
    }


}

Надеюсь, это полезно.

Контур раскадровки выглядит следующим образом: enter image description here

А раскадровка выглядит следующим образом:

enter image description here

Результат выглядит так: enter image description here

enter image description here

...