Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 调用UILabel SetText后,UITableViewCell中的移动视图将重置_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 调用UILabel SetText后,UITableViewCell中的移动视图将重置

Ios 调用UILabel SetText后,UITableViewCell中的移动视图将重置,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个带有自定义UITableView单元格的UITableView。在这个UITableViewCell中有一些UILabels和一个UIView来包含一些元素。我的布局如下所示: |-TableCell |-ContentView |-containerView | |- assignTime (UILabel) | |- assignIcon (UIImage) | |- secondaryAssignT

我有一个带有自定义
UITableView单元格的
UITableView
。在这个
UITableViewCell
中有一些
UILabel
s和一个
UIView
来包含一些元素。我的布局如下所示:

|-TableCell
    |-ContentView
        |-containerView
        |   |- assignTime (UILabel)
        |   |- assignIcon (UIImage)
        |   |- secondaryAssignTime (UILabel)
        |   |- secondaryAssignIcon (UIImage)
        |-Button 1
My
UILabels
绑定到一个
NSTimer
上,设置为每半秒启动一次。计时器显示设定时间和现在之间的差异。所有这些都很好用。当我移动
容器视图
时会出现问题,我可以很好地移动它,但只要
NSTimer
触发并更新计时器标签中的文本,视图就会重置回其原始位置。现在,这只会发生在文本中,如果我更新了图像,没有异常情况发生,
容器视图将保持在我放置它的位置

下面是我用来更新
容器视图的
位置的代码:

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

我决定在
NSTimer
中的
updateCountdown
之后调用
updateIndent
。我发现视图只在文本更改时更新,而不只是在调用
setText
时更新。因此,我对事件的顺序有了更好的理解

  • updateIndent
    被调用,视图获得其新位置
  • 计时器触发并调用
    updateCountdown
    将计时器文本设置为“00:00”,以清除缩进
  • 调用
    updateIndent
    来设置缩进
  • 计时器触发并调用
    updateCountdown
    将计时器文本设置为“00:00”缩进不变
  • 调用
    updateIndent
    来设置缩进
  • 计时器触发并调用
    updateCountdown
    将计时器文本设置为“00:01”,以清除缩进

  • 我终于把这个修好了。我为正在编辑的约束创建了一个出口。因此,我没有使用上面描述的
    updateIndent
    方法,而是对其进行了修改,只更新了一个约束

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