如何将 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?
Swift - 如何将数据从 UITableViewCell 类传递到 UIViewController
Swift - 如何从单元格内单击 UIImageView 上的自定义 UITableViewCell 获取行数据