【发布时间】:2017-12-05 16:38:11
【问题描述】:
我有一个UITableView,其中包含一个项目列表。对于该表中的每个UITableViewcell,根据从关联对象到该单元格的属性,我通过将高度约束常量更改为0 或定义为使其可见的值来切换UIButton 的可见性。我已经检查了 Xcode 设计器上的 Clip to Bounds 选项以获取该按钮。
如果我为表格视图提供一个项目列表,其中一些按钮设置为可见,而其他按钮隐藏并滚动,那么按钮可见的单元格可能会将其隐藏 em>,反之亦然。当带有按钮的单元格很少,而其余的单元格没有按钮时,这一点会更加明显。
包含显示或隐藏UIButton的逻辑的方法来自单元格的UITableViewCell自定义类,如下所示:
public partial class UITableViewCellCustom : UITableViewCell
{
public Object obj;
public void SetObject(Object obj)
{
// Do something with obj...
// Do something with the obj that determines if the buttons should be collapsed or not
Boolean collapseButton = ...;
ToggleButtonVisibility(collapseButton);
}
private void ToggleButtonVisibility(Boolean collapse)
{
NSLayoutConstraint uiButtonCancelHeightConstraint = UIButtonCancel.Constraints
.FirstOrDefault(query => query.FirstItem == UIButtonCancel
&& query.FirstAttribute == NSLayoutAttribute.Height);
NSLayoutConstraint uiButtonCancelTopConstraint = this.ContentView.Constraints
.FirstOrDefault(query => query.FirstItem == UIButtonCancel
&& query.FirstAttribute == NSLayoutAttribute.Top);
if (collapse)
{
uiButtonCancelHeightConstraint.Constant = 0;
uiButtonCancelTopConstraint.Constant = 0;
}
else
{
uiButtonCancelHeightConstraint.Constant = 30;
uiButtonCancelTopConstraint.Constant = 10;
}
}
}
SetObject 方法从 UITableViewSource 类中调用,该类从正确的索引中获取对象并将其设置到单元格(这里没问题)。然后,当一些UILabels 文本被对象中的值更改时,我检查是否需要按钮(这里没问题)。当我调用 ToggleButtonVisibility 方法并尝试更改两个约束 - height 和 top - 应用值时,top 约束明显改变,但在重用单元格时,height 约束似乎被忽略了。
我尝试将ClipToBounds 强制为true,强制在主线程中使用该方法,但它们都不起作用。我在这里错过了什么?
忘了说:当按下按钮时,表格视图被清除(我给源提供了一个空列表,然后重新加载数据),执行了一个长任务,然后是一个新的列表应用于表格,但有问题的单元格仍然带有按钮bugged。
注意事项:
- 通过将
Alpha更改为0或将Hidden设置为true来隐藏按钮不是一种选择,因为它会在tableview 中留下一个孔。
【问题讨论】:
-
您是否需要更改约束来切换可见性?你不能只改变按钮的 Alpha 或 Hidden 标志吗?
-
我同意@lowleetak 为什么不设置
alpha = 0或hidden = true来隐藏按钮? -
@lowleetak 不幸的是,如果我通过更改 Alpha / Hidden 标志来切换可见性,列表中将包含 holes,所以它不是一个选项。
-
另外,您尝试更新 UITableView 的数据并调用 tableView.ReloadData 或 tableView.RemoveRow?修改约束仍会将单元格留在 TableView 中,并且您可能仍会显示 TableView 分隔符。
-
我尝试将一个空数组提供给表格视图,重新加载数据,然后提供“实时”数据并再次重新加载,以确保所有数据和行都已更新。它仍然在发生。
标签: ios uitableview xamarin.ios uibutton nslayoutconstraint