Если просмотр контроллера A переходит к просмотру контроллера B и предполагается, что он имеет тип ViewControllerB
, то да, это жесткая связь:
prepare(for: segue, sender: sender) {
if let viewControllerB = segue.destination as? ViewControllerB {
viewControllerB.property = value
}
}
Этот код работает только в том случае, если пункт назначения является определенным классом,ViewControllerB
, и первый контроллер представления должен знать свойства ViewControllerB
.
Обычно это не проблема, потому что обычно, когда вы переходите к другому контроллеру представления, вы знаете, что вы просили, и, следовательно,чего ожидать.
Однако вы можете использовать тот же метод prepare(for:sender:)
для перехода к любому из нескольких различных типов контроллеров представления, имеющих общие свойства.
В этом случае вы можете использовать протоколычтобы ослабить связь:
Подход 2: Слабая связь по протоколу
protocol DestProtocol {
var property: String
}
Возможно, у вас есть ViewControllerB
, который соответствует DestProtocol
class ViewControllerB: UIViewController, DestProtocol {
var property: string
//The rest of ViewControllerB
}
И вы можете также иметь ViewControllerC
, который соответствует DestProtocol
class ViewControllerC: UIViewController, DestProtocol {
var property: string
//The rest of ViewControllerC
}
Затем в первом представлении контроллера prepare(for:sender:)
:
prepare(for: segue, sender: sender) {
if let destination = segue.destination as? DestProtocol {
destination.property = value
}
}
Со вторым подходом первый взглядОллер prepare(for:sender)
не знает, что пункт назначения является экземпляром ViewControllerB
.Он просто проверяет, соответствует ли пункт назначения DestProtocol
.Segue может загружать экземпляр ViewControllerB
или ViewControllerC
.