2017-02-10 30 views
0

我对这种设计模式非常困惑,我相信我目前没有得到所有要点。为什么不通过视图之间的2段传递消息,而是通过segue和deletation

让我们把一个简单的场景在这里:

两种观点,说A和B,数据通过赛格瑞传递从A到B,但B时要传递的数据回A或更改/更新一些数据属于A的数据源,这里使用委托! 为什么不只是让2 segues,让他们通过数据

我的理解是

Segue公司是“硬”的连接,控制器A通过建立一个SEGUE到控制器B连接意味着它必须知道控制器B,因此,A是保留提及B.另一方面,代理是从B到A的“丢失”连接,所以B对A不太了解。结果A到B是“硬”连接,B到A是“丢失”连接,这可以避免内存泄漏问题。

问题1:我的理解中是否有任何错误?

Question2:是否有任何其他原因使用segue和委托模式?

问题3:如果委托非常好,为什么不使用2委托进行所有数据传递和消息传递?

非常感谢您的时间和帮助

+1

塞格斯不是关于传递数据,它们是关于表示视图控制器。有时您必须将数据传递到目标视图控制器作为该进程的一部分,但这不是您使用segue的原因。 – dan

+0

@丹感谢丹,我想我误解了SEGUE使用 – SLN

回答

1

是任何有在我的理解错误?

您的建议segue假定硬连接不准确。人们可以构建一个在接收端进行协议实现的segue,而不是一个特定的类。这是完全合法的,并使您的代码更加灵活。

是否有任何其他原因使用segue和委托模式?

按照设计,segue API不是对称的:发送方在segue即将触发时收到通知,但接收方只是被打开。因此,发送者的任务是将需要的任何内容传递给接收者,以建立与发送者进行通信的方式。

如果委托是那么好,为什么不使用2名代表所有的数据传递和信息?

你完全可以使用委托进行双方通信。但是,API的不对称使得不必使用第一个委托。

+0

非常感谢您的帮助和解释 – SLN

1

问题1:是否有任何在我的理解错误?

不,这是正确的大部分时间。

问题3:如果委托非常好,为什么不使用2个委托进行所有数据传递和消息传递? ]

TL的好问题; DR答案:两个对象中的一个必须保留另一个,这样做更容易和更有意义。


让我们继续仅约ViewControllers说话,即使过程可能是真的用任何物体...... 父视图控制器必须知道孩子。逻辑对父母来说很重要,它需要知道哪个孩子要调用哪个动作。

孩子不必在意它的呈现方式,它可以在一个容器视图,在推导航控制器,模态呈现......这不费心。但是,如果它想与来电者沟通,无论是谁,使用授权都是有道理的。

您可能有一个双重委托,但您需要一个中间对象,作为两个控制器的委托,有责任在正确的控制器上传递正确的消息。而且,这两个对象都必须保留在某个地方。可能会导致一些有用的情况,但大多数情况下只有一个强有力的依赖就足够了。

此外,您不要使用委派。例如,你可以对ChildViewController一个parentViewController属性,你会设置这样的属性在父的prepareForSegue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let childVC = segue.destination as! ChildViewController 
     childVC.parentVC = self 
    } 
} 

但现在你将有一个强耦合,这意味着:

  • 潜在的保留周期(如孩子也保留了父母),你要想想父母设置为weak
  • 少的可重用性的子视图,因为它需要一个非常具体的父母。
+0

非常感谢您的详细解释 – SLN

相关问题