2

在 UIView 中,我在顶级视图控制器中有一个带有 IBAction 和方法的导航按钮。

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

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

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

谢谢

目标图片: 在此处输入图像描述

4

1 回答 1

2

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

也就是说,您想知道的是视图的生命周期中是否有一个点,您可以在视图“出现”的任何时候“做某事”(检查 BOOL 并在“是/否”时执行一些工作)。答案是肯定的,并且-willMoveToSuperview“可以”工作。

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

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

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

添加

在 UIView 中放置 IBOutlet 或 IBAction 也是不常见的。大多数情况下,除非您正在创建一些不打算单独访问和管理其部分的复合控件,否则通过让控制器管理/拥有,您的架构会更清晰(并且更符合 MVC 设计模式的精神)出路和行动。

于 2013-02-25T01:34:27.277 回答