在UIView中,我有一个带有IBAction&的导航按钮。顶级视图控制器中的方法。
在IBAction代码中,我翻转一个布尔值,以便当执行返回到UIView时,在drawRect之前有一些新的设置:重新绘制视图。
如果所有这些都在ViewController中,我可以将新的设置代码放在ViewDidAppear之类的内容中,这样每次按下按钮时都会执行。但是,在UIView级别没有这样的方法。有initWithCoder,但这似乎只执行一次(当storyboard / nib加载时)。
所以我的问题是 - 是否有一种方法可以在VC级别从我的IBAction中显式调用initiWithCoder方法(我尝试过[self initWithCoder:nil]但是UIView级别的断点不会触发)或者是否有一个方法在执行返回到UIView级别时运行,一个ViewDidAppear?
由于
目标图片:
答案 0 :(得分:2)
除非你真的知道你在做什么(我的意思是真的知道),否则不要打电话给-initWithCoder:你自己。您就像实施-drawRect:
并让系统调用它一样实施。如果你发现自己直接调用这样的东西,并且你无法解释为什么没有别的办法的深层技术原因,那么这是错误的方法。阅读并遵循文档(不仅仅是方法的文档),以确保您了解您正在使用的任何方法。它会告诉你的。
那就是说,你想知道的是,如果在视图的生命周期中有一个点,你可以“做某事”(如果是/否则检查BOOL并执行一些工作)任何时候视图“出现”。答案是肯定的,-willMoveToSuperview
“可以”起作用。
<强> BUT 强>
这是“错误的”方法,IMO。 BOOL属性(下次我被要求绘制时画出一个旋转)可以并且可能应该存在于UIView中,但其状态应该在其控制器中设置,因为这是特定于你的应用。视图应该(高度)可重用;控制器应该实现应用程序的特定逻辑,并根据模型状态和用户(或系统)操作来驱动视图。
所以:当你想要启用“绘制旋转”操作时,你的视图控制器应该设置视图实例的drawTwiddle
标志然后标记视图以进行绘制。您的视图将具有-drawRect:在某些时候称为,您不应该尝试控制,当它发生时,它会看到self.drawTwiddle == YES
并绘制旋转以及它做的任何其他绘图。
此时,您可能想让视图将自己的drawTwiddle
标志设置为NO
,因为该行为旨在触发一次。不要这样做。请注意:其他用户操作或系统事件可能随时调用-drawRect:
,因此用户实际上可能看不到旋转(它可能会显示并消失得比可见的快)。 '那么',正确的做法是让控制器(通过一些直接动作,系统事件或计时器)负责设置并取消设置 drawTwiddle
标志,然后标记视图用于重新显示。
<强>添加强>
在UIView中放置IBOutlet或IBAction也很不寻常。大多数情况下,除非您创建一些复合控件,其部件不打算单独访问和管理,您的架构更清晰(并且更接近MVC设计模式的精神),让控制器管理/拥有网点和行动。