Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么不在视图之间通过两个分段传递消息,而是一个分段和一个删除_Ios_Delegates_Segue - Fatal编程技术网

Ios 为什么不在视图之间通过两个分段传递消息,而是一个分段和一个删除

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是“丢失”这种连接可以避免内存泄漏

我对这种设计模式感到非常困惑,我相信我当时没有领会所有要点

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

两个视图,例如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个委托? ]

问一个好问题;答:两个物体中的一个必须保留另一个,这样做更容易,也更有意义


让我们继续只讨论ViewController,即使该过程可能适用于任何对象。。。 父视图控制器必须知道子视图。逻辑对父级很重要,它需要知道哪个子级调用哪个操作

孩子不必关心它是如何呈现的,它可以在容器视图中,在导航控制器中推送,以模式呈现。。。不必麻烦。但是,如果它想与调用方(无论是谁)进行通信,那么,使用委托是有意义的

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

此外,您不必使用委派。例如,您可以在
ChildViewController
上有一个
parentViewController
属性,您可以在父级的
prepareForSegue
中这样设置该属性:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let childVC = segue.destination as! ChildViewController
       childVC.parentVC = self
    }
}
但现在你会有一个强耦合,这意味着:

  • 潜在的保留周期(因为子级也保留父级),您必须考虑将父级设置为
    weak
  • 子视图的可重用性较差,因为它需要一个非常特定的父视图
问题1:我的理解有错误吗

不,大多数时候都是对的

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

问一个好问题;答:两个物体中的一个必须保留另一个,这样做更容易,也更有意义


让我们继续只讨论ViewController,即使该过程可能适用于任何对象。。。 父视图控制器必须知道子视图。逻辑对父级很重要,它需要知道哪个子级调用哪个操作

孩子不必关心它是如何呈现的,它可以在容器视图中,在导航控制器中推送,以模式呈现。。。不必麻烦。但是,如果它想与调用方(无论是谁)进行通信,那么,使用委托是有意义的

您可以有双重委托,但需要一个中间对象,作为两个控制器的委托,负责在正确的控制器上传递正确的消息。此外,两个对象都必须保留在某个位置。可能导致