Передача данных из одного контроллера в другой в storyboard, macOS


#1

Продолжаю осваивать storyboard для macOS и конечно возник самый популярный вопрос про передачу данных между контроллерами. Посмотрел вокруг но как то не выяснил что делать в моей ситуации.

В основном окне нажимает кнопку и открывается pop up окошко и с помощью segue в его контроллер передается string. В окне есть два синхронизированных NSScrolView и кнопка, по нажатию которой должно происходить обновление их view с помощью их draw(_ dirtyRect: NSRect). Но, для этого нужно передать массивы (после обработки полученной string), которые заполняются при нажатии кнопки, из контроллера для pop up окошка в другой контроллер, который отвечает за дефолтный view в который помещены синхронизированные NSScrolView.

Как передать массивы ?


#2

Коллеги подскажите пожалуйста как передать данные.
Не может быть такого чтобы никто не знал !


#3

Делегат:

Замыкание:

Уведомление:


#4

Спасибо.
Наверное несколько неясно описал ситуацию.
@IBAction для кнопки находится в первом контролере. В Вашем варианте он во втором.

Первый контроллер получает значение string из основного окна через prepare(for segue: NSStoryboardSegue, sender: Any?) одновременно с открытием pop up окна, и этот string далее должен обрабатываться в зависимости от опций выбираемых юзером в открытом pop up окне. Эта обработка происходит при нажатии кнопки в первом контроллере (контроллере отрытого pop up окна), а полученные в результате этого массивы должны передаться во второй контролер (контроллер дефолтного вью в котором находятся два NSScrolView . Этот дефолтный вью находится в pop up окне, точнее его ViewContainer). Т.е. @IBAction должна привести к передаче массивов и обновлению вида засинхронизированных NSScrolView (один масштабная линейка а втрой картинка со стрелками). Пробовал в @IBAction засунуть

performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "ORFsGraphic"), sender: self)

и соответственно прописать

var arrayOfForwardORFsLines = [[(Int, NSRange)]]()
var arrayOfReverseORFsLines = [[(Int, NSRange)]]()

 override func prepare(for segue: NSStoryboardSegue, sender: Any?)
{
    if segue.identifier!.rawValue == "ORFsGraphic"
    {
        let controller = segue.destinationController as! ORFsGraphicController
        controller.arrayOfForwardORFsLines = arrayOfForwardORFsLines
        controller.arrayOfReverseORFsLines = arrayOfReverseORFsLines
        //controller.lengthOfDNA = dna.count
    }
}

Но ничего не происходит. Я думал что при нажатии кнопки обновленные массивы должны передаваться через segue, но видимо я что то не понимаю в том как работает segue. Что не так в том что я делаю с segue.

С notification не прбовал.


#5

Решил проблему.
По причине своей глупости в использовании storyboard возник некоторый перебор. По непонятной причине, засунул ViewContainer в View pop up окошка. И в его дефолтное View вставил синхронизированные NSScrolView. Спрашивается и зачем нужен ViewContainer когда можно NSScrolView засунуть в View pop up окошка. Тогда имеем один контроллер и нет проблем с передачей массивов, все происходит в одном контроллере.

haymob спасибо за ответы !


#6

haymob спасибо еще раз, использовал сейчас Ваш образец для передачи данных между контроллерами с помощью Notification !