xcode - 在 UIView 中显式调用 initWithCoder 或 ViewDidAppear 等效项?

标签 xcode uiview ios6 viewdidload initwithcoder

在 UIView 中,我在顶级 View Controller 中有一个带有 IBAction 和方法的导航按钮。

在 IBAction 代码中,我翻转了一个 bool 值,以便当执行返回到 UIView 时,在 drawRect 之前有一些新的设置:重新绘制 View 。

如果所有这些都在 ViewController 中,我可以将新的设置代码放入 ViewDidAppear 之类的内容中,以便每次按下按钮时它都会执行。但是,UIView 级别没有这样的方法。有 initWithCoder,但这似乎只执行一次(当 Storyboard/ Nib 加载时)。

所以我的问题是 - 有没有办法在 VC 级别从 IBAction 显式调用 initiWithCoder 方法(我已经尝试过 [self initWithCoder:nil] 但 UIView 级别的断点不会触发)或者是否有一个方法在执行返回到 UIView 级别时运行,如 ViewDidAppear?

谢谢

目标图片: enter image description here

最佳答案

除非你真的知道自己在做什么(我的意思是真的知道),否则不要自己调用 -initWithCoder: 。您应该像实现 -drawRect: 一样实现它,并让系统调用它。如果您发现自己直接调用类似的方法,并且无法解释为什么没有其他方法的深层技术原因,那么这是错误的方法。阅读并遵循文档(不仅仅是方法的文档),以确保您了解所使用的任何方法。它会告诉你。

也就是说,您想知道的是,在 View 的生命周期中是否有一个点,您可以在 View “出现”时随时“执行某些操作”(检查 BOOL 并在“是/否”的情况下执行某些工作)。答案是肯定的,并且 -willMoveToSuperview “可以”工作。

但是

这是“错误”的方法,IMO。 BOOL 属性(“下次要求我绘制时绘制一个旋转”)可以而且可能应该存在于 UIView 中,但它的状态应该在其 Controller 中设置,因为这是特定于您的应用程序。 View 应该是(高度)可重用的; Controller 应该实现应用程序的特定逻辑并根据模型状态和用户(或系统)操作驱动 View 。

所以:当您想要启用“绘制旋转”操作时,您的 View Controller 应该设置 View 实例的drawTwiddle标志,然后可能标记 View 以进行绘制。然后,您的 View 将在某些时候调用-drawRect:,您不应该尝试控制,并且当它发生时,它会看到self.drawTwiddle == YES 并绘制旋转以及它所做的任何其他绘制。

此时,您可能想让 View 将其自己的 drawTwiddle 标志设置为 NO,因为该行为旨在触发一次。不要这样做。注意:其他用户操作或系统事件可能随时调用 -drawRect:,因此用户实际上可能看不到旋转(它可能出现和消失的速度比可见的速度快)。 “所以”,正确的做法是让 Controller (通过一些直接操作、系统事件或计时器)负责设置和取消设置drawTwiddle标志,然后标记 View 以重新显示。

添加

将 IBOutlet 或 IBAction 放入 UIView 中也是不常见的。大多数时候,除非您正在创建一些复合控件,其各个部分不打算单独访问和管理,否则通过让 Controller 管理/拥有商店和行动。

关于xcode - 在 UIView 中显式调用 initWithCoder 或 ViewDidAppear 等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058770/

相关文章:

c++ - Xcode 默认标志从何而来?

iphone - 访问 ipad 相册中的图像

ios - subview 层变换和布局 subview

ios - 为什么 swift uiview 无法连接到 View Controller ?

ios - 如何在 UIDictationController 中调试此崩溃?

ios - 为什么当我结合 UIImagview 时我的模糊 View 变得透明?

xcode - WebView 从本地目录加载包含所有资源的 HTML 页面

swift - 显示具有编程约束的按钮

ios - 如何将用户直接转到 App Store 的评论页面?

ios - UICollectionView insertItemAtIndexPath 不工作