removefromSuperView不删除子视图

时间:2014-05-28 01:23:12

标签: ios objective-c

我正在为我的核心数据表视图项目使用自定义TableViewCell。在自定义表视图单元类的layoutSubviews方法中,我创建了一个名为MMCircles的UIView的子类,并将其分配给_unreadIndicator属性,该属性将添加到自定义表视图的contentView中细胞,像这样

   if(self.coolColor == [UIColor greenColor]){
          _unreadIndicator = [[MMCircles alloc] initWithFrame:CGRectMake(0, 0, 18, 18) andColor:[UIColor greenColor]];
        _unreadIndicator.circleColor = [UIColor greenColor];
    }else if(self.coolColor == [UIColor redColor]){
          NSLog(@"unreadIndicator nil, creating red");
        _unreadIndicator = [[MMCircles alloc] initWithFrame:CGRectMake(0, 0, 18, 18) andColor:[UIColor redColor]];
        _unreadIndicator.circleColor = [UIColor redColor];
    }else if ...

   [self.contentView addSubview:_unreadIndicator];

最终结果是每当我创建表视图条目时,我都会添加各种颜色的圆圈(在表格单元主表视图控制器的列表中)。让我们说这个例子,我添加一个greenColor圆圈。如果我触摸单元格来编辑我创建的内容,它会在另一个视图控制器中打开,我可以选择为该单元格的_unreadIndicator选择另一种颜色。假设我尝试将其red。实际发生的是红色圆圈正在绿色圆圈上方添加。例如,如果我在上面的方法中设置较小的红色圆圈的大小,您可以清楚地看到绿色的红色顶部。如果我把红色做成相同的尺寸,它会完全覆盖绿色,没有人知道任何差异。但是,我想让用户选择将圆圈设置为clearColor,当发生这种情况时,显然会出现问题,因为原始颜色只是闪耀。因此,我必须删除_unreadIndicator(UIView的子类)而不是掩盖它。

尝试删除unreadIndicator

我尝试了几种不同的方法来删除这些圈子,但都没有成功。在上面的代码之前,我添加了以下代码,但它没有用。

[_unreadIndicator removeFromSuperview];
_unreadIndicator = nil;

此外,cellForRowAtIndexPath(在表视图控制器中)在用户编辑单元格后调用(可能包括更改颜色),因此在设置新颜色之前,我尝试从superview中删除unreadIndicator 。再次,这不起作用

        switch ([joke.mood intValue]) {
         case 0:
         [cell.unreadIndicator removeFromSuperview];
         cell.coolColor = [UIColor greenColor]; //user has chosen green during edit, therefore remove old indicator

最后,在FetchedResultsController方法didChangeObject:AtIndexPath:forChangeType:newIndexPath中,我还尝试删除旧的圆圈颜色(没有成功)。我在这里尝试过,因为用户在尝试更改圆形颜色(以及其他内容)时正在编辑表格单元格,我假设此代码被触发

   case NSFetchedResultsChangeUpdate:{
         Event *changedJoke = [self.fetchedResultsController objectAtIndexPath:indexPath];
        MMTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
         cell.unreadIndicator = nil;
        [cell.unreadIndicator removeFromSuperview];
        cell.textLabel.text = changedJoke.mnemonic;

    }

最终结果是我只能掩盖圆圈,这是不够好的,因为我需要创建圆圈的选项,而clearColor无法覆盖任何圆圈其他颜色。

如何删除这个小子视图?

1 个答案:

答案 0 :(得分:1)

您似乎重置_unreadIndicator而不在superview中删除它。所以你失去了早期视图的句柄。尝试在创建和添加新视图之前删除视图。

 if(self.coolColor == [UIColor greenColor]){
      if(_unreadIndicator)
      {
         [_unreadIndicator removeFromSuperView];
      }

      _unreadIndicator = [[MMCircles alloc] initWithFrame:CGRectMake(0, 0, 18, 18) andColor:[UIColor greenColor]];
    _unreadIndicator.circleColor = [UIColor greenColor];
}else if(self.coolColor == [UIColor redColor]){
      NSLog(@"unreadIndicator nil, creating red");
                if(_unreadIndicator)
      {
         [_unreadIndicator removeFromSuperView];
      }

    _unreadIndicator = [[MMCircles alloc] initWithFrame:CGRectMake(0, 0, 18, 18) andColor:[UIColor redColor]];
    _unreadIndicator.circleColor = [UIColor redColor];
}else if ...

[self.contentView addSubview:_unreadIndicator];