• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios:UITableVIewCell 扩展未按预期工作

[复制链接]
菜鸟教程小白 发表于 2022-12-12 21:44:41 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的 TableView 单元格有一个按钮。单击时,我想展开单元格。为了扩展,我正在更改按钮单击时单元格的高度并重新加载该行。但是,当展开一行然后我尝试展开另一行时,行为与预期不符。先前展开的行关闭而不是单击的行。

另外,有时我必须单击按钮两次才能展开。

public class ProgramMeasurementDetailsTableViewSource : UITableViewSource
{

    List<rogramMeasurementDetail> mList;

    string HeaderIdentfier = "programMeasurementDetailsHeader";
    string CellIdentifier = "programMeasurementDetailsCell";
    int TAG_CHECKBOX = 61;
    int TAG_LABEL_VITAL_NAME = 62;
    int TAG_LABEL_GOAL = 63;
    int TAG_BUTTON_EDIT = 64;
    int TAG_VIEW_HEADER_COLUMN_SEPARATOR = 66;
    int TAG_VIEW_ROW_COLUMN_SEPARATOR = 65;
    List<bool> expandStatusList = new List<bool>();
    UITableView tableView;

    public ProgramMeasurementDetailsTableViewSource(List<rogramMeasurementDetail> mList, UITableView tableView)
    {
        this.tableView = tableView;
        this.mList = mList;
        for (int i = 0; i < mList.Count; i++)
            expandStatusList.Add(false);
    }

    public override nint NumberOfSections(UITableView tableView)
    {
        return 1;
    }

    public override nint RowsInSection(UITableView tableview, nint section)
    {
        return mList.Count;
    }

    public override nfloat GetHeightForHeader(UITableView tableView, nint section)
    {
        return 32;
    }

    public override nfloat GetHeightForRow(UITableView tableView, Foundation.NSIndexPath indexPath)
    {
        if (expandStatusList[indexPath.Row])
            return 70;
        else
            return 32;
    }

    public override UITableViewCell GetCell(UITableView tableView, Foundation.NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell(CellIdentifier);
        if (cell == null)
        {
            cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier);
        }
        CheckBox checkBox = (CheckBox)cell.ViewWithTag(TAG_CHECKBOX);
        UILabel vitalNameLabel = (UILabel)cell.ViewWithTag(TAG_LABEL_VITAL_NAME);
        UILabel goalLabel = (UILabel)cell.ViewWithTag(TAG_LABEL_GOAL);
        UIButton editGoalButton = (UIButton)cell.ViewWithTag(TAG_BUTTON_EDIT);
        editGoalButton.TouchUpInside += (object sender, EventArgs e) =>
         {
             expandStatusList[indexPath.Row] = !expandStatusList[indexPath.Row];
             tableView.ReloadRows(new Foundation.NSIndexPath[] { indexPath }, UITableViewRowAnimation.Automatic);

         };

        .....
        return cell;
    }
}

我尝试在 if (cell == null) 中移动按钮单击事件处理,但按钮单击/展开根本不起作用。我放了断点,似乎这部分永远不会被执行。

我在 Storyboard中设计了单元格布局。

我已经为这个问题苦苦挣扎了一段时间了。任何帮助表示赞赏。



Best Answer-推荐答案


当您上下滚动列表时,您看到的错误是否会发生?发生这种情况是因为您在 GetCell 方法中连接了 TouchUpInside 事件处理程序,然后在重用单元格时它永远不会脱钩,因此您最终会连接多个单元格到同一个处理程序甚至多个处理程序!

一般来说,你不想在 GetCell 方法中对事物做这些类型,它应该只用于 DequeueReusableCell 或创建一个新的。其他一切都应在自定义单元格中完成。

查看您的代码示例,您似乎没有使用自定义单元格,所以您可以这样做:

1.) 在GetCell中设置按钮的标签为IndexPath的行

editGoalButton.Tag = indexPath.Row;

2.) 在 ProgramMeasurementDetailsTableViewSource 中为您的事件处理程序创建一个单独的方法:

private void ToggleRow(object sender, EventArgs e)
{
    var btn = sender as UIButton;
    expandStatusList[btn.Tag] = !expandStatusList[btn.Tag];
    tableView.ReloadRows(new Foundation.NSIndexPath[] { NSIndexPath.FromRowSection(btn.Tag, 0) }, UITableViewRowAnimation.Automatic);
}

3.) 在 GetCell 中,在重新 Hook TouchUpInside 处理程序之前取消 Hook :

editGoalButton.TouchUpInside -= ToggleRow;
editGoalButton.TouchUpInside += ToggleRow;

虽然这将确保按钮只连接一次,但它确实不是处理此类情况的正确方法。您应该使用自定义单元格并在单元格中进行所有接线,然后在 UITableViewCell 中的 PrepareForReuse 覆盖中取消 Hook 和清理。我强烈建议通过这个 Xamarin tutorial

如果您确实通过了...请注意 GetCell 方法的整合程度。

--更新-- 在您的 CustomCell 类中:

private EventHandler _tapAction;
public void Setup(EventHandler tapAction, int row, ....)
{
     //keep a reference to the action, so we can unhook it later
     _tapAction = tapAction;
     editGoalButton.Tag = row;
     ....
     editGoalButton.TouchUpInside += _tapAction;
}

public override void PrepareForReuse()
{
     ....
     editGoalButton.TouchUpInside -= _tapAction;
     _tapAction = null;
}

当您在 GetCell 中调用 Setup 时,您只需通过 ToggleRow 方法作为 Action 参数。

关于ios:UITableVIewCell 扩展未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38961804/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap