我對 Swift 編程很陌生,我正在嘗試在 NSToolbar 中設定滑塊最小值、最大值和值。作為一個假設的例子,我有一個客戶串列,我想使用工具列中的滑塊來選擇一個客戶資料頁面。我將首先在 NSViewController 中加載客戶端資料庫并計算客戶端的數量。比我想將工具列中的滑塊最小值設定為 1 并將最大值設定為客戶端數量。我了解如何將滑塊值從 Windowcontroller 發送到 ViewController,但我沒有找到如何做相反的事情,如何將資料從 Viewcontroller 發送到 Window 控制器以設定滑塊值。我附上了一個基于這個例子的簡單代碼
視圖中有一個帶有數字格式化程式的標簽。標簽的值系結到 View Controller,key path count。

視窗控制器沒有子類化。
uj5u.com熱心網友回復:
有多種方法可以實作這一目標。
一種方法是創建一個類[例如:SliderManager],它跟蹤當前值并處理增量/減量。Singleton您可以在任何 Controller的幫助下獲取 Slider 的當前值。
這是一個示例實作:
protocol SliderCountDelegate: NSObject {
func counterDidUpdate()
}
final class SliderCountManager {
static let shared = SliderCountManager()
var value: UInt8 = 0 // <-- Unsigned Integers: Only Positive numbers
weak var delegate: SliderCountDelegate?
public func increaseCounter() {
value = 1
delegate?.counterDidUpdate()
}
public func decreaseCounter() {
value -= 1
delegate?.counterDidUpdate()
}
}
以下是您應該如何在代碼中使用它:
// WindowController.swift
import Cocoa
class WindowController: NSWindowController {
@IBOutlet weak var myBoutton: NSToolbarItem!
override func windowDidLoad() {
super.windowDidLoad()
}
@IBAction func previous(_ sender: Any) {
SliderCountManager.shared.increaseCounter()
print(SliderCountManager.shared.value) // <- Accessing Current value here
}
@IBAction func next(_ sender: Any) {
SliderCountManager.shared.decreaseCounter()
print(SliderCountManager.shared.value)
}
}
import Cocoa
class ViewController: NSViewController, SliderCountDelegate {
@IBOutlet weak var myLabel: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
SliderCountManager.shared.delegate = self // Set Delegate to `self`
}
override var representedObject: Any? {
didSet {
}
}
// Protocol conformance
func counterDidUpdate() {
myLabel.stringValue = String(SliderCountManager.shared.value)
}
}
uj5u.com熱心網友回復:
感謝您提出的解決方案。它確實讓我朝著 wrigth 的方向前進。
這就是我所做的。在 WindowController 中,我設定了一個工具列,其中包含 1) 按鈕 ?previous?、2) 按鈕 ?next? 和 3) 滑塊 ?slider?。
這些鏈接到 WindowController 中正確的 IBOutler 和 IBaction。viewController 有一個 textLabel ?myLabel?
2 個按鈕和滑塊更改 ViewControler 中的 slider_ptr 值并發送到 myLabel。此外,slider.label 會根據 slider_pointer 和 slider_max 值而變化。下面是 windowController 的代碼:
import Cocoa
class WindowController: NSWindowController {
@IBOutlet weak var slider: NSSlider!
@IBOutlet weak var sliderTB: NSToolbarItem!
var viewController: ViewController {
get {
return self.window!.contentViewController! as! ViewController
}
}
override func windowDidLoad() {
super.windowDidLoad()
setSlider() // set initial value based on ViewController
}
@IBAction func previous(_ sender: Any) {
viewController.previous (WindowController())
setSlider()
}
@IBAction func next(_ sender: Any) {
//viewController.updateMyLabelText(newText: "Prev Button clicked! ")
viewController.next (WindowController()) //send to VC function previous
// let pt = viewController.slider_ptr 1
//let sMax = viewController.slider_max
setSlider()
//sliderTB.label = String(pt) " de " String(sMax)
}
@IBAction func sliderDidChange(_ sender: Any) {
viewController.sliderDidSlide (WindowController(), pointer: Int(slider.doubleValue))
setSlider()
// viewController.sliderDidSlide(PosiWC(), sValue: myslider.doubleValue)
}
func setSlider() {
/* myslider.minValue = 1
myslider.maxValue = Double(max)
myslider.integerValue = pointer*/
//print ("WCP58:" , myslider.integerValue )
let pt = viewController.slider_ptr
let sMax = viewController.slider_max
//slider (max : pt, pointer: sMax)
sliderTB.label = String(pt) " de " String(sMax)
slider.minValue = 1
slider.maxValue = Double(sMax)
slider.integerValue = pt
}
}
對于 Viewcontroller :
class ViewController: NSViewController {
var slider_ptr = 1 // slider position
var slider_max: Int = 0 //
@IBOutlet weak var myLabel: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
slider_max = 250
myLabel.stringValue = String(slider_ptr)
}
override var representedObject: Any? {
didSet {
}
}
func previous(_ sender: Any) {
if slider_ptr > 1 {
slider_ptr -= 1
}
else { NSSound.beep()}
myLabel.stringValue = String(slider_ptr)
}
func next(_ sender: Any) {
if slider_ptr < slider_max {
slider_ptr = 1
}
else { NSSound.beep()}
myLabel.stringValue = String(slider_ptr)
}
func sliderDidSlide(_ sender: Any, pointer : Int) {
print (pointer)
slider_ptr = pointer
myLabel.stringValue = String(slider_ptr)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504422.html
上一篇:嘗試讀取MacOS剪貼板內容
