【问题标题】:Adjusting UIView after loading from storyboard从情节提要加载后调整 UIView
【发布时间】: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]*,因为当时_myButtonnil

我通过将此行添加到MyViewControllerviewDidLoad: 解决了这个问题

[(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


【解决方案1】:

听起来您正确使用了viewDidLoad:。根据苹果的docs

你通常重写这个方法来执行额外的初始化 在从 nib 文件加载的视图上。

如果您的目标是在UIView 级别封装此功能,请尝试layoutSubviews

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多