【问题标题】:iOS: UIImageView backgroundcolor somehow reset after setting it in viewWillAppeariOS:UIImageView 背景颜色在 viewWillAppear 中设置后以某种方式重置
【发布时间】:2015-04-08 08:58:00
【问题描述】:

很奇怪的问题。我根据coredata 实体类别中的属性值设置UIImageView 的backgroundcolor。单击UINavigationController 中的类别可以更改此类别。因此,在更改类别并“弹出”回UINavigationController 层次结构后,我希望调整backgroundcolor。一开始我只在viewWillAppear 方法中有这段代码。就像这样,它总是先设置新颜色,然后再切换回原来的状态。现在我通过将代码放在viewWillAppear 和viewDidAppear 中来“修复”它。但我不喜欢在不知道为什么的情况下这样做。知道错误在哪里吗?

这是当前代码:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    //First the category name and pin
    //ATTENTION: I don't know why but without having this placed in viewWill and viewDidAppear, this wouldn't work..
    if(self.poi.belongsToCategory){
        self.categoryLabel.text = self.poi.belongsToCategory.name;
        self.categoryLabel.textColor = [UIColor blackColor];
        self.pinColorImageView.backgroundColor = [POICategory getColorForPinColorType:[self.poi.belongsToCategory.pinColor intValue]];
    } else {
        self.categoryLabel.text = NSLocalizedString(@"0_category_uncategorized", nil);
        self.pinColorImageView.backgroundColor = [UIColor redColor];
        self.categoryLabel.textColor = [UIColor grayColor];
    }
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    //First the category name and pin
    if(self.poi.belongsToCategory){
        self.categoryLabel.text = self.poi.belongsToCategory.name;
        self.categoryLabel.textColor = [UIColor blackColor];
        self.pinColorImageView.backgroundColor = [POICategory getColorForPinColorType:[self.poi.belongsToCategory.pinColor intValue]];
    } else {
        self.categoryLabel.text = NSLocalizedString(@"0_category_uncategorized", nil);
        self.pinColorImageView.backgroundColor = [UIColor redColor];
        self.categoryLabel.textColor = [UIColor grayColor];
    }

    //And then place the pin on the map and zoom
    [self.mapView addAnnotation:self.pin];
    [self focusOnPin];
}

【问题讨论】:

  • 可能是因为你调用[super viewWillAppear:animated];和[super viewDidAppear:animated];在超类中做了一些颜色变化?
  • 您如何更改 belongsToCategory 属性?执行viewWillAppear 后是否可以设置。即,您是在该调用之后还是之前弹出控制器并设置类别?如果是这样,颜色可能会设置为 viewWillAppear 中的先前颜色,然后 viewDidAppear. 中的新颜色值得描述您如何弹出和更改类别。
  • 好吧,我只调用 super,但我没有在 super 类中做任何颜色更改。
  • @RoryMcKinnel 你的回答怎么了?
  • @Mikael 抱歉,我不确定我是否理解。回答什么?我的最后一条评论是询问更多关于belongsToCategory 是如何设置错误理论的信息。我怀疑viewWillAppear 可能正在被调用,(除非@MichiZH 可以确认它肯定没有被输入),并且问题是我上一条评论中提到的调用时间的结果。但是,自从询问以来我没有看到任何更新,因此无话可说。

标签: ios objective-c core-data uiimageview mkmapview


【解决方案1】:

viewWillAppear 在嵌入导航控制器时弹回 viewController 时不会被调用。您的一种方法是仅在 viewDidAppear 中显示它,但我的猜测是它会导致一些不太好的闪烁。

最优雅的解决方案是向第二个视图控制器添加协议。让呈现视图控制器注册为委托。然后呈现视图控制器可以实现一个委托方法来更改颜色,并且只有在完成后才弹出呈现的视图控制器。

如果您需要一些代码来帮助您入门,请告诉我。

【讨论】:

  • viewWillAppear 在您从一个控制器弹回到另一个控制器时被调用。这就是为什么有时您必须检查它是否已被调用,因为控制器正在被推送/呈现或由于弹出/关闭而被暴露。
  • 是的,我同意。也许不是最好的选择。在他的情况下,底线 willAppear 未被调用。
  • 我不明白,你们莫名其妙地互相矛盾,不是吗?但感谢您的协议建议,我认为这是要走的路。
  • 我不认为我们相互矛盾只是取决于你的堆栈结构如何,在你的情况下 viewWillAppear 显然没有被调用。无论哪种方式,你应该使用 presentViewController 并创建一个协议都没关系......快乐编码!
猜你喜欢
  • 2014-06-24
  • 2023-03-25
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多