为啥我不能将 UIView 分配给 self.view?

Posted

技术标签:

【中文标题】为啥我不能将 UIView 分配给 self.view?【英文标题】:Why can't I assign a UIView to self.view?为什么我不能将 UIView 分配给 self.view? 【发布时间】:2013-12-02 17:08:12 【问题描述】:

这可能是一个愚蠢的问题,但我会开枪的。

我做了一个小测试项目来测试我对滑动视图控制器类型的概念。我天真地假设我可以在控制器中创建一个带有插座的 UIView(我们称之为 peekView),并从任何可见的视图控制器调用类似 [slidingControllerSlideFrom:self.view] 的东西,这样的实现是:

- (void)slidingControllerSlideFrom(UIView*)controllersMainView

    // push side controller to top of navigation stack

    self.peekView = controllersMainView;

    // sliding animation


但是没有效果。推送控制器中没有崩溃、没有警告、没有视图变化。 当然,当尝试将自己的视图添加为子视图时,推送的控制器会崩溃,但将其分配给预定义的 UIView 只会导致任何结果。

那么,为什么?如果仅仅“为什么”还不足以成为一个问题——当我尝试将一个控制器的视图分配给另一个控制器的子视图时会发生什么,以及设计 UIKit 的原因是什么,您无法从 self.view 设置视图?

【问题讨论】:

你在哪里设置self.view?我在您的代码中没有看到任何地方...... 在你的赋值之后放置一个断点并打印出两个视图的值,包括它们的父视图和框架。它可能会让人们更容易知道发生了什么。 @bdesham 我改写了示例代码以更准确地适应问题。不过效果一样。 self.view 由 xib 定义,属于任意控制器。 peekView 是菜单控制器的子视图,它也是由一个 xib 定义的。这清楚了吗? 我知道有很多方法可以实现滑动控制器,但这不是我的目标。我只是想了解为什么以及如何从 self.view 设置视图是不允许的,因为它似乎是在其他控制器中显示视图控制器视图的最直接方式(是的,有 addChildViewController 但这是 iPhone 中的一些禁忌原因) 刚刚注意到您的评论并更新了我的答案以尝试回答您实际提出的问题。 【参考方案1】:

为此,您有两种选择:

1 - 如果 peekView 中的控制器在给定场景中始终是同一个控制器,请使用“容器视图”。这些解释here。基本上,它们允许您在场景中添加由另一个控制器管理的视图。

2 - 如果 peekView 中的控制器依赖于不同的条件,您将不得不创建类似于自定义 tabbarcontroller 的东西。这意味着您实例化您需要的控制器,将其视图添加为 peekView 的子视图(不将控制器的视图分配给 peekView 本身),然后使用didmovetoparentviewcontroller 通知子控制器。 This question 可能会有所帮助。

更新:

刚刚看到您的评论,所以让我回答您的实际问题:peekview 属性实际上只是对您放置在屏幕中的真实 UIView 的引用。当你这样做时:

self.peekView = controllersMainView;

您正在更改引用,但没有更改视图对象本身。这就是为什么您没有看到任何变化。有多种方法可以通过代码向控制器添加新视图,但简单地使用 addSubview 将控制器视图添加到控制器中已经存在的 UIView 会更简单。

【讨论】:

【参考方案2】:

在这里查看讨论:subView Slide up from bottom of the screen 在这里:SubView slide in animation, iphone

希望这能给你一些关于如何处理这项任务的框架!

【讨论】:

以上是关于为啥我不能将 UIView 分配给 self.view?的主要内容,如果未能解决你的问题,请参考以下文章

变量未传递给 UIView

为啥我不能将任意迭代分配给步长为 -1 的扩展切片?

为啥我不能将具有用户定义参数的方法分配给 c# 中的按钮?

简单的 Python 问题:为啥我不能将变量分配给排序列表(就地)? [复制]

为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?

为啥类型不能分配给泛型类型