Как обновить NSImageView с помощью NSSlider?
У меня есть NSSlider
в FirstViewController
, У меня 12 NSImageViews
в SecondViewController
, Я хотел бы переместить ползунок в первом окне и перетасовать изображения в этих 12 видах во втором окне.
Как обновить эти NSImageViews
каждый раз при перемещении слайдера?
SecondViewController
var imagesQty = 100
override func viewWillAppear() {
super.viewWillAppear()
//let arrayOfViews: [NSImageView] = [view01,...view12]
for view in arrayOfViews {
let i = Int(arc4random_uniform(UInt32(imagesQty-1)))
let image = NSImage(data: try Data(contentsOf: photos[i]))
view.image = image
}
}
ViewController
@IBOutlet weak var slider: NSSlider!
@IBAction func segueData(_ sender: NSSlider) {
self.performSegue(withIdentifier: .secondVC, sender: slider)
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if segue.identifier! == .secondVC {
if let secondViewController =
segue.destinationController as? SecondViewController {
secondViewController?.imagesQty = slider.integerValue
}
}
}
1 ответ
Прежде всего следует помнить, что любое движение ползунка выполняет новый переход. Чтобы избежать этого, объявите логическое свойство, которое устанавливается, когда переход выполняется в первый раз, и может быть сброшено после того, как контроллер второго представления был отклонен.
Для обновления значения во втором контроллере представления сохраните ссылку и вызовите метод
На самом деле с этим кодом вам не нужен ползунок IBOutlet
class ViewController: NSViewController {
var secondControllerIsPresented = false
var secondController : SecondViewController?
...
@IBAction func segueData(_ sender: NSSlider) {
if !secondControllerIsPresented {
self.performSegue(withIdentifier: .secondVC, sender: sender)
secondControllerIsPresented = true
} else {
secondController?.updateArray(value: sender.integerValue)
}
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier, identifier == .secondVC {
let secondViewController = segue.destinationController as! SecondViewController
secondController = secondViewController
let slider = sender as! NSSlider
secondViewController.imagesQty = slider.integerValue
}
}
...
class SecondViewController: NSViewController {
...
func updateArray(value : Int) {
print(value)
}
Честно говоря, я бы использовал кнопку, чтобы выполнить переход и переместить ползунок во второй контроллер вида. Чтобы перемешать массив, используйте Array
расширение и как просмотреть NSCollectionView
а не куча просмотров изображений