2010-09-21 65 views
12

删除子视图关于如何重置一个UITableView任何想法?从UITableViewCell中的内容查看(重置的UITableView)

我想在按下按钮时显示一组新数据,并从单元格的contentView中删除所有子视图,并用一组新子视图刷新它们。我试过[tableView reloadData],但数据确实刷新了,但是添加到contentView之前的子视图仍然存在。

回答

36
更好

然而,当你创建单元格:

#define MY_CUSTOM_TAG 1234 
mySubview.tag = MY_CUSTOM_TAG; 
[cell.contentView addSubview:mySubview] ; 

,后来,当您需要将其删除:

[[cell.contentView viewWithTag:MY_CUSTOM_TAG]removeFromSuperview] ; 
+0

这是一个非常巧妙的解决办法;) – Abolfoooud 2011-09-02 08:03:06

+0

正在申报的最后一个表视图单元格和重装子视图。别人细胞的所有其它子视图不刷新 – 2016-11-15 07:08:39

+0

'cell.contentView.viewWithTag(MY_CUSTOM_TAG)?removeFromSuperview()' – 2017-09-20 07:16:06

24

我得到了答案:)

if ([cell.contentView subviews]) { 
    for (UIView *subview in [cell.contentView subviews]) { 
     [subview removeFromSuperview]; 
    } 
} 

这段代码将检查单元格的内容观点有任何子视图。
如果有的话,它会在for循环迭代中删除它们!

+0

体面的解决办法... +1 – Rumin 2015-09-10 09:41:15

+0

它只是从上表视图细胞剥离,不是所有的表视图细胞 – 2016-11-15 07:01:17

+0

完美的解决方案! – 2017-11-24 07:45:09

16

而不是通过所有的子视图迭代的(自己)删除他们,你可以简单地做到这一点,

[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
+6

即通过子视图实际迭代将其删除。 ;) – 2012-02-29 20:47:12

+0

我编辑了我的答案:) – EmptyStack 2013-12-05 07:06:58

2

如果你想删除所有的UITableViewCell的子视图,你可以我们E本代码:

NSArray* subviews = [cell.contentView subviews]; 
for (UIView* subview in subviews) { 
    [subview removeFromSuperview]; 
} 

使用@leftspin的代码

1

我知道这个问题是旧的,但我发现与解决的问题,如果你从一个原型细胞中删除一个子视图,这种观点会从所有重用的单元中移除,这将在下一个将被重用的单元中创建一个空指针。

如果子类的UITableViewCell并从那里子视图,你必须先做到这一点的验证:

if (mySubView != nil) { 
     mySubView.removeFromSuperview() 
    } 

这也将你的cellForRow内工作在indexPath方法

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyCustomCell 

    if (cell.mySubView != nil) { 
     cell.mySubView.removeFromSuperview() 
    } 
    return cell 
} 

惠特本你避免了空指针,代码是swift 3.希望这有助于某人。 :)

0

对于雨燕3.1

 let theSubviews: Array = (cell?.contentView.subviews)! 
     for view in theSubviews 
     { 
      view.removeFromSuperview() 
     }