故事板Segue vs代表团。哪种方法更适合在ViewControllers之间传递数据

时间:2018-03-27 08:48:15

标签: ios iphone swift model-view-controller uistoryboardsegue

我在iOS中是全新的,想知道在ViewControllers之间使用哪种方法传递数据。我更喜欢segues,因为只使用一行代码就可以获得对ViewController及其字段,方法等的引用......另一方面,委托是ios中的一个重要主题。我现在很困惑使用哪种方法。请解释一下。

4 个答案:

答案 0 :(得分:0)

非常仔细地回答我的回答,这在很大程度上取决于您使用的架构(MVC,MVP,VIPER等)以及代码的组织方式

答案是:取决于你想要达到的目标。

<强> Segue公司

当您需要将数据从一个UIViewController传递到另一个UIViewController以便可以正确渲染时,您将使用segues。这是一种非常简单的方法。

<强>团

当您需要使对象(例如,UIViewController)知道在另一个对象(例如,另一个UIViewController)中发生的操作时,您可以使用委托(以及其他)来实现此目的。

答案 1 :(得分:0)

以下是这两者的基本行为。我也包括通知,以便您可以区分委托和通知。您将来会使用通知:
Segue :当您必须将一些数据从一个UIViewController发送到另一个时,最简单的方式。 VC! - &GT; VC2 即可。请记住,VC2应该是导航层次结构中的下一个 委派:用于在触发事件时通知对象。示例 - 从API获取数据。显示收到数据时的activityIndi​​cation。当API完成它的工作时隐藏它。使用块或闭包可以非常容易地实现此行为 注意:当您只需要通知一个对象时,这非常有用 通知:用于在触发事件时通知对象 注意:这用于通知一个或多个对象。

答案 2 :(得分:0)

我正在进行授权。我使用闭包将数据从VC2发送到VC1,并将值从VC1设置为VC2。 别忘了在故事板或代码中使用NavigationController

class VC1: UIViewController {
  var someValue1:Bool = false

  func viewDidLoad() {
    super.viewDidLoad()
  }

  @IBAction func buttonTapped(_ sender:UIButton) {
    showVC2()
  }

  func showVC2() {
    let vc = UIStoryboard(name: "PlaceTrackList", bundle: nil).instantiateInitialViewController() as! TrackListViewController
    vc.completionClosure { [weak self] someValueFromVC2 in
      // close when button tapped in VC2 and set value like in VC2
      self?.someValue1 = someValueFromVC2
      self?.navigationController?.popToViewController(self, animated: true)
    }
    navigationController?.pushViewController(vc, animated: true)
  }


class VC2: UIViewController {
  var someValue2:Bool = true
  completionClosure: ((Bool) -> Void)?

  func viewDidLoad() {
    super.viewDidLoad()
  }

  @IBAction func VC2ButtonTapped(_ sender:UIButton) {
    completionClosure?(someValue2)
  }

}

答案 3 :(得分:-1)

就数据传递而言

如果你想将数据从VC1传递到VC2而不是segue是有用的,那么它取决于你想传递数据的位置,但是如果你想将数据从VC2传输到VC1那么这就是你无法做到的事情为了实现segues,你可以使用委托。

一般而言

委托 - 委托是对象之间的通信方式,例如表格视图委托方法,当触摸单元格时会通知您

相关问题