【问题标题】:Xamarin.iOS - How hide or delete a static cell from TableViewControllerXamarin.iOS - 如何从 TableViewController 隐藏或删除静态单元格
【发布时间】:2017-04-19 22:12:05
【问题描述】:

我需要隐藏或删除 TableView 中的静态行。

我尝试了几种方法,但没有任何效果。

我试过这个:

public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();

    if ( TableView.NumberOfRowsInSection(0) == 9)
    {
        TableView.CellAt(NSIndexPath.FromItemSection(0, 0)).RemoveFromSuperview();
        TableView.ReloadRows(new NSIndexPath[] { TableView.IndexPathForCell(TableView.CellAt(NSIndexPath.FromItemSection(0, 0))) }, UITableViewRowAnimation.Fade);
    }
}

但是不行,单元格继续在TableView中。

我试试这个:

public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();

    if ( TableView.NumberOfRowsInSection(0) == 9)
    {
        TableView.DeleteRows(new NSIndexPath[] { NSIndexPath.FromItemSection(0, 0) }, UITableViewRowAnimation.None);
    }
}

但是抛出了这个异常:

Foundation.MonoTouchException:抛出 Objective-C 异常。姓名: NSInternalInconsistencyException 原因:无效更新:无效 第 0 节中的行数。包含在第 0 节中的行数 更新后的现有节 (9) 必须等于 更新之前该部分中包含的行 (9),加号或减号 从该部分插入或删除的行数(0 插入, 1 已删除)并加上或减去移入或移出的行数 该部分(0 移入,0 移出)。

之后,我尝试了这个:

public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();

    if ( TableView.NumberOfRowsInSection(0) == 9)
    {
        TableView.DataSource.CommitEditingStyle(TableView, UITableViewCellEditingStyle.Delete, NSIndexPath.FromItemSection(0, 0));
        TableView.DeleteRows(new NSIndexPath[] { NSIndexPath.FromItemSection(0, 0) }, UITableViewRowAnimation.None);
    }
}

但是现在抛出了这个异常:

Foundation.MonoTouchException:抛出 Objective-C 异常。姓名: NSInvalidArgumentException 原因:-[DetalheContas tableView:commitEditingStyle:forRowAtIndexPath:]: 无法识别 选择器发送到实例 0x7fd49590

我该怎么办?

【问题讨论】:

    标签: ios uitableview xamarin xamarin.ios


    【解决方案1】:

    我不完全确定您为什么要尝试从“ViewDidLayoutSubviews()”中删除表格视图中的单元格,因为这将被多次调用,因此当您尝试删除时,该单元格并不总是存在它。我在这里假设它确实是您要删除的单元格。不管这里是一个示例代码 sn-p,用于使用“淡入淡出”动画从表格中删除单元格,我可以在上面看到您使用:

    YourTableSource.ReplaceSource(SomeData);
    
    SomeTable.BeginUpdates();
    SomeTable.DeleteRows(new NSIndexPath[] { NSIndexPath.FromItemSection(0, 0)}, UITableViewRowAnimation.Fade);
    SomeTable.EndUpdates();
    

    值得注意的是,您的源计数必须与您提交的删除数量不同。

    【讨论】:

    • 我有一个只应该出现在特定条件下的数据,请记住:我使用的是静态单元格。我试过你的例子,但是这个错误出现“Foundation.MonoTouchException:Objective-C异常抛出。名称:NSInternalInconsistencyException原因:无效更新:第0节中的行数无效。更新后现有节中包含的行数(10)必须等于更新前该节中包含的行数 (10),加上或减去从该节插入或删除的行数(0 插入,1 删除)"
    • 我尝试了 ViewDidLayoutSubviews(),我应该尝试使用哪种方法? ViewWillAppear()?
    • 是的 'ViewWillAppear()' 可以说是一个更实用的解决方案,因为理论上它应该只在每次 UIViewController 初始化时出现一次。您收到的错误消息是因为您没有从 tableviews 源中删除任何项目。仅仅因为它们是静态的并不意味着您不能从 Tableviews 源中删除和重新添加它们。除非有特定原因您不想这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多