除非你真的知道自己在做什么(我的意思是真的知道),否则不要自己调用 -initWithCoder:。您应该像实现它一样实现它-drawRect:
并让系统调用它。如果你发现自己直接调用这样的东西并且你无法解释为什么没有其他方法的深层技术原因,那么这是错误的方法。阅读并遵循文档(不仅仅是方法的文档),以确保您了解您正在使用的任何方法。它会告诉你。
也就是说,您想知道的是视图的生命周期中是否有一个点,您可以在视图“出现”的任何时候“做某事”(检查 BOOL 并在“是/否”时执行一些工作)。答案是肯定的,并且-willMoveToSuperview
“可以”工作。
但
这是“错误”的方法,IMO。BOOL 属性('下次我被要求绘制时画一个旋转)可以并且可能应该存在于 UIView 中,但它的状态应该在其控制器中设置,因为这是特定于您的应用程序的。视图应该是(高度)可重用的;控制器应该实现您应用程序的特定逻辑并根据模型状态和用户(或系统)操作驱动视图。
所以:当你想启用“画一个旋转”操作时,你的视图控制器应该设置视图实例的drawTwiddle
标志,然后可能标记视图进行绘图。然后,您的视图将具有 -drawRect:在某些时候您不应该尝试控制的调用,并且当它这样做时,它会看到self.drawTwiddle == YES
并绘制旋转以及它所做的任何其他绘图。
此时,您可能很想让视图将其自己的drawTwiddle
标志设置为,NO
因为该行为旨在触发一次。不要这样做。注意:其他用户操作或系统事件可能-drawRect:
随时调用,因此用户实际上可能看不到旋转(它可能出现和消失的速度比可见的快)。“所以”,正确的做法是让控制器(通过一些直接操作、系统事件或计时器)负责设置和取消设置drawTwiddle
标志,然后标记视图以重新显示。
添加
在 UIView 中放置 IBOutlet 或 IBAction 也是不常见的。大多数情况下,除非您正在创建一些不打算单独访问和管理其部分的复合控件,否则通过让控制器管理/拥有,您的架构会更清晰(并且更符合 MVC 设计模式的精神)出路和行动。