Как обновить 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
    }
}

Вьюконтроллер

@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 
        }
    }
}

person Andy Fedoroff    schedule 28.03.2018    source источник


Ответы (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, а не набор изображений.

person vadian    schedule 28.03.2018
comment
Скажите, сколько лет вы потратили, чтобы достичь такого уровня в программировании? - person Andy Fedoroff; 28.03.2018
comment
Около полугода, чтобы понять основы объектно-ориентированного программирования. Я прочитал книгу и руководство по языку Objective-C. Я никогда не хотел копировать и вставлять код вместе, не зная, что происходит. Это как настоящий язык: вам будет веселее, если вы свободно говорите на этом языке. Потом около года, чтобы разобраться в наиболее часто используемых фреймворках (Foundation, AppKit, позже UIKit). Тогда переход на Swift был небольшим шагом. Но опять же я прочитал весь языковой справочник. - person vadian; 28.03.2018