Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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_Swift_Delegates_Uicollectionview - Fatal编程技术网

Ios 将视图设置为其自己的代理

Ios 将视图设置为其自己的代理,ios,swift,delegates,uicollectionview,Ios,Swift,Delegates,Uicollectionview,我正在考虑将一个UICollectionView子类化,并将其设置为自己的委托,编写自己的委托包装器。在记忆方面安全吗?(对象将指向自身)我认为这(内存方面)没有问题,因为委托和数据源变量很弱 weak public var delegate: UICollectionViewDelegate? weak public var dataSource: UICollectionViewDataSource? 只要您有另一个对视图具有强引用的类,就应该没有问题。视图将保留在内存中,直到父类释放它,

我正在考虑将一个
UICollectionView
子类化,并将其设置为自己的委托,编写自己的委托包装器。在记忆方面安全吗?(对象将指向自身)

我认为这(内存方面)没有问题,因为委托和数据源变量
很弱

weak public var delegate: UICollectionViewDelegate?
weak public var dataSource: UICollectionViewDataSource?

只要您有另一个对视图具有强引用的类,就应该没有问题。视图将保留在内存中,直到父类释放它,或者父类本身被释放。

如前所述,这是可能的,但要遵循MVC和其他类似的良好开发模式,最好将数据源和委托与视图分开。否则,您将走上一条难以测试代码的道路,并混淆数据和视图之间的界限。在你目前的计划中,这一点的影响可能并不明显,但可能会在以后发生。
通过对集合视图进行子类化,还将取消视图生命周期回调,包括viewDidLoad和ViewWillDisplay等,这对设置视图很有用。如果要实现自己的数据源和委托包装器,至少要为UICollectionViewController创建子类。这样,您就可以在不违反良好惯例的情况下定制行为

没有内存问题,但可能会导致代码难以使用或维护。集合视图在某一点上需要与其他对象协调,如果没有委托,这将很困难。这是一个有趣的问题-我们一直在这样做,对我来说,这是唯一的出路。如果您需要完整的容器视图(这是另一种选择),请这样做。但是,如果它只是一个典型的代理-一个照顾自己的小集合视图-出于什么可能的原因,您会将它包装在另一个类中以获得代理?关于Aaron的观点@AaronBrager,正如你所说的,这个问题“在某个点上需要与其他对象协调”。。。。。。但是,我做过的每一个屏幕上的每一件事都是如此,呵呵!当然,就像任何控件一样,它可能是一件复杂的事情,包括委托等。但是代码模式是分形的。假设你是苹果公司制造“UISlider”或“UILabel”或“UIButton”的团队。当然,“从外面”这只是一个滑梯。但在UISlider中,您已经。。。。。。。。。。。MVC模式!然而,一旦你到了“外面”。。。。。。。。。。。。。。这只是一个控制。类似地,假设我创建了一个“城市列表”(实际上,这是一个集合视图,但其他团队成员对此并不关心)。从外部看,你确实希望它是一个整体的“V”视图。