【问题标题】:Permanently hide an item on Interface Builder via code通过代码永久隐藏 Interface Builder 上的项目
【发布时间】:2017-02-06 11:03:24
【问题描述】:

我有一个奇怪的问题。无论是在 SO 中还是通过 google,都无法通过搜索找到解决方案。

我的UIViewController 中有一个UIView,它由故事板引导。 这个UIView 通过Interface Builder 设置为隐藏。

在某些时候基于某些逻辑,我需要透露这个UIView

很简单:myView.isHidden = false

问题是每次我的UIViewController 加载时,它都会覆盖之前发生的任何事情 - 例如取消隐藏视图 - 并再次将视图设置为隐藏。

是否有一种聪明的方法可以永久隐藏或者我应该使用 UserDefaults 存储值并每次将其加载到 ViewWillAppear 中?

感谢任何可能的建议。

注意:我正在使用Swift3 语法编码

************************编辑************************

为了更清楚: 我有一堆自定义弹出窗口,它们位于专用的故事板文件中。每个弹出窗口都有一个UIViewController

这些弹出窗口基本上是成就​​弹出窗口。他们有 3 颗星,默认情况下全部隐藏(通过他们持有的 3 个UIImageView 上的 IB 属性)。

在应用程序中,如果用户达到某种成就,我将从该故事板文件调用相关的 UIViewController 并显示(取消隐藏)相关的成就星。就这样。

主要风投:

let viewController = UIStoryboard(name: "AchievementsPopUp", bundle: nil).instantiateViewController(withIdentifier: "Category1PopUp")
viewController.modalPresentationStyle = .overCurrentContext
self.present(viewController, animated: true, completion: nil)

在相关的类文件中,我通过代码取消隐藏星号并呈现给用户。一旦用户关闭 popupVC 并返回主窗口,该 UIImageView 的“取消隐藏”属性就会丢失。 我已经使用 UserDefaults 上的一个属性解决了这个问题,它工作得很好。 问题是我必须创建 15 个不同的属性(5 个屏幕,每个屏幕有 3 颗星)并管理相关代码,这变得有点混乱 :-) 如果有更智能的解决方案,我将很乐意实施!

【问题讨论】:

  • 每次从情节提要加载场景时,都会根据情节提要设置属性。您需要在viewDidLoad 中编写一些代码来根据需要隐藏或取消隐藏视图
  • 感谢@Paulw11,这正是我将要做的“解决方法”。但看起来这不是一种解决方法,而是一种正常行为。

标签: ios uiview uiviewcontroller interface-builder swift3


【解决方案1】:

你应该看看Apple's documentation for Preserving and Restoring State

保存和恢复过程大部分是自动的,但您需要告诉 iOS 应用程序的哪些部分要保存。保留应用的视图控制器的步骤如下:

  1. (必需)将恢复标识符分配给要保留其配置的视图控制器;请参阅标记视图控制器以进行保存。
  2. (必需)告诉 iOS 如何在启动时创建或定位新的视图控制器对象;请参阅在启动时恢复视图控制器。
  3. (可选)对于每个视图控制器,存储将视图控制器返回到其原始配置所需的任何特定配置数据;请参阅对视图控制器的状态进行编码和解码。

【讨论】:

  • 感谢您的回答@picciano。我不是 100% 确定这是我在问题中描述的情况。状态配置更多的是关于您的应用程序何时进入后台或被停止以防止内存泄漏。还原其组件(UI 也是)时,会根据还原点重建它们的形式。就我而言,我永远不会离开应用程序。只需在应用程序生命周期中多次加载相同的故事板--> UIViewController。也许我的问题不是 100% 清楚,我会尝试用一些示例进行编辑。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多