Несколько контейнерных представлений с делегатами - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть контроллер View, который содержит 2 контейнера.Один из них имеет вид с прокруткой, один из них - просто маленький вид.

Теперь я хочу общаться между всеми тремя способами. Я использую основной ViewController в качестве делегата длядругой 2. Изначально я не знал, как установить их в качестве делегатов, поскольку нет перехода или представления других (они просто есть)

Спросив здесь несколько месяцев назад, я получил следующееответ:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "embedSegue") {
        resultsVC = (segue.destination as! GoalsVC)
        resultsVC.calcDelegate = self
    }
}

Однако я не знаю, как это сделать для ОБА содержащихся представлений.они оба используют один и тот же segue, так что я не могу, чтобы у них обоих был один и тот же ViewController.

Я думал об использовании идентификаторов раскадровки, но как мне ссылаться на них в prepareforsegue?было бы что-то вроде

if (segue.identifier == "embedSegue" && storyboardidentifier = "myVC1") {
    resultsVC = (segue.destination as! GoalsVC)
    resultsVC.calcDelegate = self
} else if (segue.identifier == "embedSegue" && storyboardidentifier = "myVC2") {
    otherVC = (segue.destination as! NewVC)
    resultsVC.calcDelegate = self
}

За исключением того, что я не знаю точный код для ссылки на раскадровку

1 Ответ

0 голосов
/ 07 декабря 2018

Если вы используете?вместо !Вы можете использовать успех преобразования, чтобы указать, есть ли у вас правильный viewcontroller.Код будет выглядеть следующим образом:

if segue.identifier == "embedSegue" {
    if let resultsVC = segue.destination as? GoalsVC {
        resultsVC.calcDelegate = self
    }
    if let otherVC = segue.destination as? NewVC {
        resultsVC.calcDelegate = self
    }
}

Вы можете еще больше упростить этот код, делегировав настройки делегата.Установите новый делегат, убедитесь, что ваши два встроенных контроллера представления соответствуют ему.В приведенном ниже коде я предположил, что уже написанный вами делегат называется CalcDelegate.

protocol CalcDelegateDelegate {
    var calcDelegate : CalcDelegate? {get set}
}

class GoalsVC : UIViewController, CalcDelegateDelegate {
    var calcDelegate: CalcDelegate? = nil
}

class NewVC : UIViewController, CalcDelegateDelegate {
    var calcDelegate: CalcDelegate? = nil
}

Тогда ваш код подготовки упрощается до

if segue.identifier == "embedSegue" {
    if var delegate = segue.destination as? CalcDelegateDelegate {
        delegate.calcDelegate = self
    }
}

Любого нового контроллера представления, встроенного вваш главный контроллер просто должен соответствовать делегату, и он автоматически получает calcDelegate и может связываться с вашими другими контроллерами представления.

...