UIScrollView 对象通过引用传递,不被返回

Posted

技术标签:

【中文标题】UIScrollView 对象通过引用传递,不被返回【英文标题】:UIScrollView object passed by reference, not being returned 【发布时间】:2011-05-04 23:31:34 【问题描述】:

我有一个场景:

带有 UIViewController (mainVC) 的 UINavigationController 和包含 UIScrollView (scrollView) 的 UIView (mainView) mainView 中的全屏按钮,点击它会推送一个新的 UIViewController (fullScreenVC),滚动视图对象通过引用传递给它(与属性属性 nonatomic 和 assign 一起存储)。 fullScreenVC 正确显示了 scrollView 对象。 关闭 fullScreenVC 后,会向 mainVC 发送 NSNotification。这就是问题所在...

当 fullScreenVC 被移除时,scrollView 不再显示在 mainVC 中。我可以通过在通知期间在日志上打印出 scrollView 来判断它仍然存在。

我认为通过引用发送和存储滚动视图,mainVC 仍然会保留它。我还尝试将 scrollView 发送回 mainVC 以防它被删除,但这并没有做任何事情。

解决它的唯一方法是在通知步骤中将 scrollView 添加回 mainVC。在发送 UIScrollView 对象(或更一般的 UIKit 对象)时,我需要做些什么特别的事情吗?还是我在某处做了什么蠢事?

【问题讨论】:

【参考方案1】:

没有传递引用。在 Objective-C 中,我们有指向对象的指针,这些指针被分配和传递(而不是对象本身)。

无论如何,这与这里无关。您的问题是,在 UIKit 中,一个视图只能有一个超级视图(它是一个树层次结构)。当您将视图作为子视图添加到另一个视图时,它会自动从其先前的父视图中删除(如果有的话)。请参阅 addSubview 的文档:此处:https://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/addSubview:

您真的需要在两个不同的屏幕上显示相同的滚动视图吗?这似乎有点奇怪。您应该有两个不同的滚动视图;或者,您可以确保在完成另一个后将其添加回您的“mainView”。

【讨论】:

啊,一个视图只能有一个父视图是有道理的。我在 2 个不同的屏幕中使用滚动的原因是因为在滚动视图中添加项目需要进行大量设置,我认为必须重新创建它是一种浪费。完成后,我最终将其添加回 mainView。我认为按引用传递与按指针传递是一样的(与按值传递相反,对象在哪里传递)?可能只是 C/C++ 行话。

以上是关于UIScrollView 对象通过引用传递,不被返回的主要内容,如果未能解决你的问题,请参考以下文章

通过引用传递对象[重复]

通过引用传递;为啥原始对象没有改变?

通过引用递归传递对象? JAVA

通过 const 引用传递对象?

使对象不通过引用传递

通过引用方法传递对象数组