如何将 UITableViewCell 从“正常”视图切换为透明,然后再返回

Posted

技术标签:

【中文标题】如何将 UITableViewCell 从“正常”视图切换为透明,然后再返回【英文标题】:How to switch a UITableViewCell from "normal" view to transparent, and back again 【发布时间】:2012-08-22 02:09:07 【问题描述】:

我有一个表格视图,可以在视图模式和编辑模式之间来回切换。我有一个单元格,我希望它在视图模式下是透明的,并且在编辑模式下看起来像一个“正常”单元格(即白色背景,圆角矩形轮廓)。基本上,当您进入和退出编辑模式时,您在联系人应用中看到姓名单元格所做的事情是一样的。

我使用How to create a UITableViewCell with a transparent background中的解决方案获得了透明背景,但我不知道如何恢复原始背景。

目前,我在 viewDidLoad 中创建了两个背景视图:

nameCellDefaultBackview = [[UIView alloc] initWithFrame:CGRectZero];
nameCellDefaultBackview.backgroundColor = [UIColor clearColor];

nameCellEditBackview = [[UIView alloc] initWithFrame:CGRectZero];
nameCellEditBackview.backgroundColor = [UIColor whiteColor];

然后我给我的单元格设置默认的背景视图:

nameCell.backgroundView = nameCellDefaultBackview;

在setEditing:animated中:我根据编辑模式设置单元格的背景:

if (editing) 
    nameCell.backgroundView = nameCellEditBackview;
 else 
    nameCell.backgroundView = nameCellDefaultBackview;

问题是,在编辑模式下,我得到一个白色矩形而不是看起来像一个单元格的东西——这正是我所要求的,但不是我想要的:)。我尝试了其他一些事情,比如将 backgroundView 设置为 nil(这似乎 = 没有变化),并将“初始”背景视图保存在 viewDidLoad 中(这似乎不起作用,并在调试器中查看变量当我尝试将其分配给 setEditing 中的单元格时为 0x0)。

所以我想要的是在正常模式下看起来像这样:

在编辑模式下就像这样:

但我目前在编辑模式下得到的是:

那么我该如何恢复白色背景/边框/圆角呢?

【问题讨论】:

【参考方案1】:

如果您想在编辑模式下使用原始单元格,您应该考虑显示和隐藏单元格,而不是设置背景视图。背景视图被添加为所有其他视图后面的子视图,因此,将其设置为透明无效。参考:Apple Doc。

要隐藏或显示表格单元格,请参阅post

【讨论】:

谢谢瑞克。我实际上并不想删除单元格,只需在透明和白色之间来回更改它的背景。上面的代码确实使它透明(所以文本漂浮在表格背景上),但我似乎无法让它恢复为典型的白色/边框/圆角不透明。 哦,这就是你想要的。看看KDaker的回答是否有帮助。 我应该在开始时包含屏幕截图:)。谢谢你的意见,我还是学到了一些东西!【参考方案2】:

对于编辑模式,不要设置背景视图。进入编辑模式时只需调用[tableView reloadData] 并在cellForRowAtIndexPath 中设置背景视图,如下所示:

if (!editing) 
    nameCell.backgroundView = nameCellDefaultBackview;

//if it is editing, then it will take the default style.

希望这会有所帮助。

【讨论】:

感谢KDaker。我尝试了您的建议,但单元格永远不会恢复为默认样式(即,它保持透明,即使在编辑模式下也是如此)。我逐步使用调试器并确认上面的代码正在按预期执行 - 我需要一个 else 吗?现在,单元格和表格在同一个笔尖,我应该把它放在它自己的笔尖中,以便我可以从笔尖重新加载吗? 嗯......嗯,看到你的原始代码的问题是这个nameCellEditBackview = [[UIView alloc] initWithFrame:CGRectZero];。它导致单元格显示为白色而没有框架。您需要以某种方式恢复单元格的框架。我能想到的一种方法是尝试将原始视图存储为实例变量origFrame = nameCell.backgroundView。然后在编辑模式下重新分配它。希望这行得通。 我最初确实尝试过这个,但是由于某种原因,当我后来尝试使用 origFrame 时它是 nil。我在 viewDidLoad 中“捕获”了原始帧(请参阅原始问题),但理论上该单元尚未初始化,因此没有什么可捕获的?无论哪种方式,它都不起作用:(。感谢您的意见,我找到了解决方法。【参考方案3】:

我决定稍微改变一下我的方法,现在可以了:

我现在有两个单元格,而不是试图显示/隐藏一个单元格的背景:

IBOutlet UITableViewCell *nameCellViewMode;
IBOutlet UITableViewCell *nameCellEditMode;

在viewDidLoad中:我改变nameCellViewMode的背景使其透明:

UIView *clearBackgroundView = [[UIView alloc] initWithFrame:CGRectZero];
clearBackgroundView.backgroundColor = [UIColor clearColor];

nameCellViewMode.backgroundView = clearBackgroundView;

按照 KDaker 的建议,我现在只需在 setEditing:animated: 中执行 tableView reloadData,然后在 cellForRowAtIndexPath 中执行此操作:

if (self.editing)

   return nameCellEditMode;

else

   return nameCellViewMode;

【讨论】:

以上是关于如何将 UITableViewCell 从“正常”视图切换为透明,然后再返回的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 UITableViewCell 传输到另一个 UIViewController?

将 UIImageView 从正常更改为突出显示不起作用

Swift - 如何将数据从 UITableViewCell 类传递到 UIViewController

Swift - 如何从单元格内单击 UIImageView 上的自定义 UITableViewCell 获取行数据

如何将数据从 uitableviewcontroller 发送到 uitableviewcell

如何从 UITableViewCell 中获取价值