【问题标题】:Creating a UIView to be displayed in multiple UIViewControllers创建要在多个 UIViewController 中显示的 UIView
【发布时间】:2014-04-19 05:20:40
【问题描述】:

我正在创建一个简单的小弹出视图,类似于按下音量按钮时出现的弹出窗口。我想在不同的视图控制器中显示该弹出视图的实例。我一直在考虑几种方法,但我想知道什么是最佳方法,同时考虑到 MVC、复杂性和其他“良好”实践。

目前,我正在我的 UIViewController 中创建和显示此 UIView。我证明了这种方法是合理的,因为它真的是一个小视图,我用它做了很多工作来修改它在那个 VC 中的行为,所以代码已经在 VC 中了。本质上,我制作了一个框架,设置背景,应用圆角半径,添加文本,应用运动效果,然后使其淡入然后淡出。我可以将代码复制并粘贴到我的其他 VC 中,但这显然是一种不好的方法。

我可以创建一个 UIView 的子类,并且我确信我可以使用 drawRect 来绘制它,但是我不确定如何将该视图正好添加到 VC 的中间,除非我拖出一个视图到我的风投并改变它的类别。但是如果我这样做了,无论如何我都可以在 Interface Builder 中完成大部分工作,这将是首选,尤其是如果我可以使用 Auto Layout 始终保持居中。但是,我需要将该 UIView 复制并粘贴到每个 VC 中并将其隐藏 -​​ 这听起来不太好。

我可以创建 UIView 的子类,而不是使用 drawRect 进行绘制,而是实现一个创建 UIView 并返回它的方法。然后在 VC 中,我只需调用该方法并将它返回的视图添加为子视图。我从来没有这样做过,我不确定这是否合适。

实现这种可以从我的任何 VC 屏幕上显示的视图的可行方法是什么?谢谢!

请注意,此视图应始终保持相同大小,位于屏幕中心,不与任何特定 VC 绑定。它应该保持在屏幕上,不受过渡等的影响。它非常模仿音量弹出窗口。

【问题讨论】:

  • 如果此弹出视图在整个应用程序中只有一个目标(而不是特定的视图控制器),则子类化(单例方法)是最好的。即使它具有特定于视图控制器的操作,只需对delegates 进行一些编码,您就可以轻松地在任何地方重复使用它。另一种选择,如果您希望它在屏幕上的相同位置持续存在,而与视图/控制器(和转换)无关,您可以将代码添加到 appDelegate,并将视图添加到应用程序的窗口,而不是视图控制器。然后,您可以从每个 VC 调用 appDelegate 的方法来处理此弹出窗口。
  • 我很难想象比上面 n00bProgrammer 的评论更糟糕的建议。辛格尔顿?真的吗?不要走那条路。
  • 确实,弹出窗口确实需要通过转换持续存在 - 它不是特定于任何 VC。不过,将它放在应用程序委托中“感觉”是错误的。

标签: ios objective-c uiview uiviewcontroller


【解决方案1】:

我想在多个视图控制器中显示相同的弹出窗口。

我希望您的意思是您希望在多个视图控制器中拥有同一类的单独实例。一个给定的视图只能有一个超级视图,因此一次不能存在多个视图。

我不确定如何将该视图添加到 VC 的中间

将视图置于其父视图的中心很容易。要水平居中,请从父级的宽度中减去视图的宽度。将结果除以 2。这是您的 X 坐标。 Y 坐标也是如此,只是您显然会使用高度。

更简单的方法是通过将超级视图的宽度和高度分别除以 2 来创建一个点。将视图的 center 属性设置为该点。

实现这种可以从我的任何 VC 屏幕上显示的视图的可行方法是什么?

不要试图重复使用 same 视图。没有必要这样做,并且尝试在控制器之间传递它确实会使您的代码复杂化。只需让任何需要显示弹出窗口的控制器创建自己的副本即可。

请记住,视图是存储在模型中的数据的接口——它们可以显示该数据或让您与模型进行交互,但它们本身不应存储应用程序状态。鉴于此,没有理由您需要在多个视图控制器中使用相同的视图。只要您的弹出窗口从正确的位置获取数据,您就可以拥有任意数量的实例。

如果您的弹出窗口确实与您的任何视图控制器的内容分开,另一种可能的策略是使用视图控制器包含。您可以创建一个仅处理“应用程序范围”内容的视图控制器,例如此弹出窗口,并让它加载和卸载各种其他视图控制器,因为它是子级。不过,我会告诫不要尝试这个——它可能比你需要的更复杂,而且肯定比你现在应该尝试的更复杂,因为你似乎仍在获得你的海腿。

【讨论】:

  • 很抱歉没有说得更清楚。事实上,我确实想要它的多个实例,而不是试图从字面上重用相同的确切视图。创建一个实例,显示它,让它在几秒钟后消失。我想对其进行编码,以便我可以将我想要显示的字符串传递给它 - 例如“成功”或“失败”。我只是不确定采取哪种方法来实际实施它。
  • 保持简单。尽可能使用标准部件——例如 UILabel。
  • 我喜欢简单。那么它应该只是创建 UIView 并返回它的单独类中的常规方法 - 不需要是 UIView 的子类吗?
【解决方案2】:

听起来MBProgressHUD 就是您要找的东西。 FFCircularProgressView 也可能有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多