【发布时间】:2012-11-23 10:41:08
【问题描述】:
我有一个名为MyView 的自定义UIView 类,我将它与通过情节提要配置的UIViewController 一起使用。大多数视图属性是通过 Interface Builder 配置的;但是,在将它们设置为按钮的背景之前,我需要以编程方式调整几个图像,如下所示:
-(void)setupVisuals {
UIImage *image = [[UIImage imageNamed:@"myButton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)];
// _myButton is an IBOutlet property set through the storyboard:
[_myButton setBackgroundImage:image forState:UIControlStateNormal];
}
问题是我不能从初始化器中调用[self setupVisuals]*,因为当时_myButton是nil。
我通过将此行添加到MyViewController 的viewDidLoad: 解决了这个问题
[(MyView*)self.view setupVisuals];
有了这个调用,一切正常。然而,这感觉像是一种变通方法,而不是解决可能是相对常见问题的解决方案。
是否有一个UIView 方法可以覆盖,或任何其他机制来完成MyView 的视觉效果的初始化而不利用viewDidLoad: 机制?
* 在这种情况下,初始化程序是
initWithCoder:,因为视图是从情节提要中加载的。我验证了初始化程序被正确调用,但视觉效果还没有准备好。
【问题讨论】:
-
IIRC
initWithFrame:即使从 NIB/XIB 加载也会被调用。从那里,打电话给super,你不能这样做吗?我记得有一个类似的问题,我解决了,但我不记得它是什么/如何。 -
在这些情况下,我通常只在
viewWillAppear中进行“初始化”,但如果有更简洁的方法来处理它,我想知道。基本上什么时候从情节提要中加载视图并且其所有出口都完好无损? -
您是否尝试了 viewController 中 viewWillAppear 方法中的 [self.myView setupVisuals]?如果您在 IB 中初始化该视图并将其设置为插座,这应该可以工作。
-
@DanF 这正是 OP 想要避免的。设置视图应该在类内部完成,而不是从视图控制器。 (这会违反封装。)
-
@H2CO3 我尝试提供
initiWithFrame:,但是当从情节提要加载视图时它不会被调用:(
标签: objective-c ios uiview uistoryboard