Ios 为什么不在视图之间通过两个分段传递消息,而是一个分段和一个删除
我对这种设计模式感到非常困惑,我相信我当时没有领会所有要点 让我们在这里放一个简单的场景: 两个视图,例如A和B,数据从A传递到B。但是,当B希望将数据传递回A或更改/更新属于A数据源的某些数据时,此处使用委托为什么不做两段,让它们传递数据 我的理解是: Segue是一个“硬”连接,控制器a通过Segue建立与控制器B的连接意味着它必须知道控制器B,因此,a保留对B的引用。另一方面,代理是从B到a的“丢失”连接,因此B对a不太了解。因此a到B是“硬”连接,B到a是“丢失”这种连接可以避免内存泄漏问题 问题1:我的理解有错误吗 问题2:是否有其他理由使用segue和delegate模式 问题3:如果委托很好,为什么不在所有数据传递和消息传递中使用2个委托 非常感谢你的时间和帮助 我的理解有错误吗 您关于segue假设硬连接的建议不准确。可以构建一个segue,该segue在接收端编程到协议实现,而不是特定的类。这是完全合法的,并且使您的代码更加灵活 使用segue和delegate模式还有其他原因吗 从设计上看,segueapi是不对称的:当segue即将启动时,发送方会收到一个通知,而接收方只会被打开。因此,发送方的任务是将所需的信息传递给接收方,以建立一种方式,使其能够与发送方通信 如果委托很好,为什么不为所有数据传递和消息传递使用2个委托呢 你完全可以用一个代表来沟通双方。然而,API的不对称性使得没有必要使用第一个委托 我的理解有错误吗 您关于segue假设硬连接的建议不准确。可以构建一个segue,该segue在接收端编程到协议实现,而不是特定的类。这是完全合法的,并且使您的代码更加灵活 使用segue和delegate模式还有其他原因吗 从设计上看,segueapi是不对称的:当segue即将启动时,发送方会收到一个通知,而接收方只会被打开。因此,发送方的任务是将所需的信息传递给接收方,以建立一种方式,使其能够与发送方通信 如果委托很好,为什么不为所有数据传递和消息传递使用2个委托呢 你完全可以用一个代表来沟通双方。然而,API的不对称性使得没有必要使用第一个委托 问题1:我的理解有错误吗 不,大多数时候都是对的 问题3:如果委托很好,为什么不在所有数据传递和消息传递中使用2个委托? ] 问一个好问题;答:两个物体中的一个必须保留另一个,这样做更容易,也更有意义Ios 为什么不在视图之间通过两个分段传递消息,而是一个分段和一个删除,ios,delegates,segue,Ios,Delegates,Segue,我对这种设计模式感到非常困惑,我相信我当时没有领会所有要点 让我们在这里放一个简单的场景: 两个视图,例如A和B,数据从A传递到B。但是,当B希望将数据传递回A或更改/更新属于A数据源的某些数据时,此处使用委托为什么不做两段,让它们传递数据 我的理解是: Segue是一个“硬”连接,控制器a通过Segue建立与控制器B的连接意味着它必须知道控制器B,因此,a保留对B的引用。另一方面,代理是从B到a的“丢失”连接,因此B对a不太了解。因此a到B是“硬”连接,B到a是“丢失”这种连接可以避免内存泄漏
让我们继续只讨论ViewController,即使该过程可能适用于任何对象。。。 父视图控制器必须知道子视图。逻辑对父级很重要,它需要知道哪个子级调用哪个操作 孩子不必关心它是如何呈现的,它可以在容器视图中,在导航控制器中推送,以模式呈现。。。不必麻烦。但是,如果它想与调用方(无论是谁)进行通信,那么,使用委托是有意义的 您可以有双重委托,但需要一个中间对象,作为两个控制器的委托,负责在正确的控制器上传递正确的消息。此外,两个对象都必须保留在某个位置。可能会导致一些有用的情况,但大多数情况下,有一个强大的依赖就足够了 此外,您不必使用委派。例如,您可以在
ChildViewController
上有一个parentViewController
属性,您可以在父级的prepareForSegue
中这样设置该属性:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let childVC = segue.destination as! ChildViewController
childVC.parentVC = self
}
}
但现在你会有一个强耦合,这意味着:
- 潜在的保留周期(因为子级也保留父级),您必须考虑将父级设置为
weak
- 子视图的可重用性较差,因为它需要一个非常特定的父视图
让我们继续只讨论ViewController,即使该过程可能适用于任何对象。。。 父视图控制器必须知道子视图。逻辑对父级很重要,它需要知道哪个子级调用哪个操作 孩子不必关心它是如何呈现的,它可以在容器视图中,在导航控制器中推送,以模式呈现。。。不必麻烦。但是,如果它想与调用方(无论是谁)进行通信,那么,使用委托是有意义的 您可以有双重委托,但需要一个中间对象,作为两个控制器的委托,负责在正确的控制器上传递正确的消息。此外,两个对象都必须保留在某个位置。可能导致