【问题标题】:Code to connect NSbutton to a method to load a NSView from Xib将 NSbutton 连接到从 Xib 加载 NSView 的方法的代码
【发布时间】:2019-04-12 20:35:37
【问题描述】:

我正在开发我的第一个应用程序。我有一些我想连接的 NSButton,以便每个按钮将不同的子视图加载到现有的 NSView 中。我对此还是很陌生,我正在努力寻找最好的编码方式。

我有一个类来处理按钮动作,为了简洁起见,这里只显示一个:

class SelectorTest: NSObject {

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

ContentView.showView1()

}
}

以上工作正常,按下按钮时字符串会打印到控制台。它给出了“调用'showView1()'的结果未使用”错误。我想我正在为在 ContentView 类的 showview1() 方法中添加什么而苦苦挣扎。

我创建了一个视图、一个 .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,但你没有使用它为任何东西”。我被困在这部分,如何更新视图以显示我刚刚创建的视图?

【问题讨论】:

  • 第一个问题:按钮在哪里?大概你有一个初步的看法?另外,有视图控制器吗?可能有助于显示更多代码以将所有这些放在上下文中。 (还有你不使用故事板/笔尖的原因吗?)
  • 感谢罗恩的回复。我会用更多信息更新问题。
  • 什么是SNView?
  • El - 一个错字,已修复。谢谢!

标签: swift macos nsview


【解决方案1】:

给你。 (让它成为第二个答案,而不是编辑我以前的答案,因为前一个已经足够长了。我还是新来的,我希望这不违反任何规则。不要试图玩声誉的事情:)

主视图控制器仍然是从情节提要生成的。

如果这有点冗长,我只是想展示所有的机器。毫无疑问,还有很多其他方法可以做同样的事情。



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()
    }


}


【讨论】:

  • 抱歉回复晚了,谢谢!我会努力解决的。
【解决方案2】:

这是我认为(我可能错了)你想做的一个简单的例子,用故事板完成。如果您更喜欢以编程方式做事,那只需要多几行代码,但构建 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.
    }


}

希望这有帮助。

故事板大纲如下所示:

故事板看起来像这样:

结果如下所示:

【讨论】:

  • 非常感谢,非常感谢您的帮助!是否可以包含额外的代码以编程方式执行此操作?正如我所提到的,我仍然只是在学习基础知识,我希望尽可能多地使用代码。
  • 我自己其实更喜欢这种方法。我会这样做,但我有几件事要先做。
  • 没问题,罗恩,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2016-12-26
  • 2014-04-04
  • 2017-12-09
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多