调用UILabel SetText后,UITableViewCell中的Moved View重置

时间:2015-10-15 15:10:21

标签: ios objective-c uitableview

我有UITableView个自定义UITableViewCell。在此UITableViewCell内部有一些UILabel和一个UIView来包含一些元素。我的布局看起来像这样:

|-TableCell
    |-ContentView
        |-containerView
        |   |- assignTime (UILabel)
        |   |- assignIcon (UIImage)
        |   |- secondaryAssignTime (UILabel)
        |   |- secondaryAssignIcon (UIImage)
        |-Button 1

我的UILabels绑定到一个NSTimer设置,每半秒启动一次。计时器显示设定时间和现在之间的差异。所有这一切都很好。问题发生在我移动Container View时我可以移动它,但只要NSTimer触发并更新Timer标签中的文本,视图就会重置回原来的位置。现在,这只发生在文本中,如果我更新图像没有发生异常,Container View会保留在我放置的位置。

以下是我用于更新Container View's职位的代码:

-(void) updateIndent{
    int indent = 20;
    CGRect f = self.contentView.frame;
    f.size.width = f.size.width - self.myUnit.depth * indent;
    f.origin.x = f.origin.x + self.myUnit.depth * indent;
    self.containerView.frame = f;
    [self.containerView updateConstraints];
}

用于更新定时器和图像的代码:

-(void) updateCountdown{
    Assignment *a = [self.myUnit getPrimaryAssignment];
    if(a){
        [self.assignTime setText:[a getTimeRemaining]];
        [self.assignIcon setBackgroundImage:[a getIcon] forState:UIControlStateNormal];
    } else {
        [self.assignTime setText:@""];
        [self.assignIcon setBackgroundImage:nil forState:UIControlStateNormal];
    }

    Assignment *s = [_myUnit getSecondaryAssignment];
    if(s){
        [self.secondaryAssignTime setText:[s getTimeRemaining]];
        [self.secondaryAssignIcon setBackgroundImage:[s getIcon] forState:UIControlStateNormal];
    } else {
        [self.secondaryAssignTime setText:@""];
        [self.secondaryAssignIcon setBackgroundImage:nil forState:UIControlStateNormal];
    }
}

因此,回顾一下,当我调用updateIndent时,视图会按预期更新。当我调用updateCountdown时,如果调用了setText方法,则视图会重置回其原始位置。

修改

我尝试将所有内容移到containerView之外,但它仍然具有相同的效果。我还试图通过将其替换为文字字符串并仍然相同来查看它是否与我的getTimeRemaining有关。我更新了我的文字,containerView重置了它的位置。

编辑2

我添加了一些断点,看看我是否能够确切地看到视图重置的时间。我在这些行中添加了断点

Assignment *a = [self.myUnit getPrimaryAssignment];
Assignment *s = [_myUnit getSecondaryAssignment];
[self.secondaryAssignIcon setBackgroundImage:[s getIcon] forState:UIControlStateNormal];

updateIndent

中的之后
[self.containerView updateConstraints];

我发现视图在这些地方都没有移动到新的位置。理论上,视图应该在updateCountdown被调用的时候更新。

编辑3

我决定在updateIndent updateCountdown之后致电NSTimer。我发现只有在文本发生变化时才会更新视图,而在调用setText。所以,我对事件的顺序有了更好的理解。

  1. updateIndent被调用,视图获得新的位置
  2. 计时器触发并调用updateCountdown将计时器文本设置为“00:00”清除缩进
  3. 调用
  4. updateIndent来设置缩进
  5. 计时器触发并调用updateCountdown将计时器文本设置为“00:00”缩进未更改
  6. 调用
  7. updateIndent来设置缩进
  8. 计时器触发并调用updateCountdown将计时器文本设置为“00:01”清除缩进

1 个答案:

答案 0 :(得分:0)

我终于能够解决这个问题了。我为我正在编辑的约束创建了一个出口。因此,我不是使用上面描述的updateIndent方法,而是将其重新设计为只更新一个约束。

self.indentMargin.constant = self.myUnit.depth * indent;