在 UIView 中,我在顶级 View Controller 中有一个带有 IBAction 和方法的导航按钮。
在 IBAction 代码中,我翻转了一个 bool 值,以便当执行返回到 UIView 时,在 drawRect 之前有一些新的设置:重新绘制 View 。
如果所有这些都在 ViewController 中,我可以将新的设置代码放入 ViewDidAppear 之类的内容中,以便每次按下按钮时它都会执行。但是,UIView 级别没有这样的方法。有 initWithCoder,但这似乎只执行一次(当 Storyboard/ Nib 加载时)。
所以我的问题是 - 有没有办法在 VC 级别从 IBAction 显式调用 initiWithCoder 方法(我已经尝试过 [self initWithCoder:nil] 但 UIView 级别的断点不会触发)或者是否有一个方法在执行返回到 UIView 级别时运行,如 ViewDidAppear?
谢谢
目标图片:
最佳答案
除非你真的知道自己在做什么(我的意思是真的知道),否则不要自己调用 -initWithCoder: 。您应该像实现 -drawRect:
一样实现它,并让系统调用它。如果您发现自己直接调用类似的方法,并且无法解释为什么没有其他方法的深层技术原因,那么这是错误的方法。阅读并遵循文档(不仅仅是方法的文档),以确保您了解所使用的任何方法。它会告诉你。
-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/