2015-10-15 54 views
0

我有一个UITableView并带有自定义UITableViewCell。在这个UITableViewCell里面有几个UILabel s和一个UIView包含一些元素。我的布局看起来是这样的:移动UITableViewCell中的视图在调用UILabel SetText后重置

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

UILabels被束缚在单一NSTimer集火每隔半秒钟。定时器显示设定时间和现在之间的差异。所有这些工作正常。当我移动Container View时会出现问题,我可以将其移动,但NSTimer一旦触发并更新了定时器标签中的文本,视图就会重置回原来的位置。现在,这只发生在文本上,如果我更新图像没有不寻常的事情发生,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重置其位置。

EDIT 2

我加了一些断点,看看我能清楚地看到,当视图自行复位。我加了断点这些线路

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

而且这条线后updateIndent

[self.containerView updateConstraints]; 

我发现,认为不会移动到新位置在这些地方。从理论上讲,视图应该在updateCountdown被调用的时候更新。

编辑3

我决定在NSTimerupdateCountdown之后调用updateIndent。我发现只有当文本改变时才会更新视图,而不是只是在调用setText时。所以,我对事件的顺序有了更好的理解。

  1. updateIndent被调用,查看获得新的位置
  2. 定时器火灾,并呼吁updateCountdown设置定时器文本为“00:00”清除缩进
  3. updateIndent被调用来设置缩进
  4. 定时器火灾并呼叫updateCountdown设置计时器文本为“00:00”缩进不变
  5. updateIndent被调用来设置缩进
  6. 定时器火灾,并呼吁updateCountdown设置定时器文本为“0时01分”清除缩进

回答

0

我终于能得到这个固定。我创建了一个我正在编辑的约束条件的出口。因此,而不是使用上述的updateIndent方法,我重新修改它只是更新一个约束。

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