Сегменты Swift тесно связаны? - PullRequest
0 голосов
/ 28 мая 2018

В Swift, использующем MVC, распространенным способом пересылки данных является использование prepare(for:sender:).Внутри этого метода вы получаете ссылку на целевой VC и получаете доступ к его свойствам для отправки данных.Но разве это не считается соединением контроллеров представления?Я надеюсь, что ответ не считается вопросом мнения, потому что я действительно хотел бы понять, как segues вписываются в MVC.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Если просмотр контроллера 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.

0 голосов
/ 28 мая 2018

Передача данных в segue полностью совместима с MVC.Конечный виртуальный канал считается представлением исходного виртуального канала.Когда контроллер связывается с View , он конфигурирует View с необходимыми ему данными.Запись в открытый интерфейс (свойства) destinationVC - это то, как вы его настраиваете.Это то, что происходит в prepare(for segue:sender).

Забота о связи связана с повторным использованием .Чем более тесно связаны контроллеры view, тем сложнее их повторно использовать.Это проблема, только если destinationVC знает подробности sourceVC.Если destinationVC необходимо передать данные обратно в sourceVC, он должен сделать это, используя Delegation (где protocol используется для определения методов, которые sourceVC орудия).

...