【问题标题】:UITableView delete section - header stays visibleUITableView 删除部分 - 标题保持可见
【发布时间】:2023-03-07 07:00:01
【问题描述】:

在看不见的部分上使用[UITableView deleteSections:withRowAnimation:] 后 - 部分标题仍然可见。

在这张图片上,我们看到了tableview的可见部分

在下一张图片中,我们看到整个 tableview - AISLE 2 在用户向下滚动之前是隐藏的,它只包含一行:

当我向下滚动并删除最后一行时,AISLE 2 部分标题仍然可见,即使我使用了deleteSections。如果我从 AISLE 1 中删除一行,部分标题仍保留在同一位置,向下滚动我仍然可以看到它。

此外,当尝试向下滚动以使 AISLE 2 标题出现在视图中时,UI 充当 AISLE2 不是 tableview 的一部分,并立即将我向上滚动。这意味着 - 这是一个垃圾视图,显然不是表格的一部分,因为我删除了它。出于某种原因,iOS 不会删除此视图,而是将其与表格解除关联。

有什么想法吗?

【问题讨论】:

  • 删除部分后,您是否尝试在委托方法中将部分数量设置为 1?
  • 是的,部分删除工作正常,除了这种情况
  • 不显示代码应该如何帮助你?
  • @vikingosegundo 正如我所提到的,代码运行良好,除了这种情况。
  • 但是:你一定有错误。

标签: ios objective-c cocoa-touch uitableview


【解决方案1】:

尝试[tableview reload]numberofsections 设为1。

【讨论】:

    【解决方案2】:

    您的数据来自哪里?您如何知道一开始有多少个部分?我认为您的问题可以通过解释这一点轻松解决。

    看起来您可能有一个多维nsmutablearray,其中每个索引都是一个通道,每个对象都包含该通道的产品?或者您可以为每个过道设置不同的阵列?

    当您删除一个单元格时,只需检查剩余多少个单元格,然后调用[self.tableView reloadData];

    对于(假设的)示例;

    如果您有一系列过道:

    NSMutableArray *aisleOne = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];
    NSMutableArray *aisleTwo = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];
    NSMutableArray *aisleThree = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];
    NSMutableArray *aisleFour = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];
    

    然后将它们添加到一个数组中:

    NSMutableArray *aisleArray = [[NSMutableArray alloc] initWithObjects:aisleOne, aisleTwo, aisleThree, aisleFour, nil];
    

    然后,在您删除单元格时调用此代码。它将从aisleArray 中删除所有空通道(需要全局定义):

    NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:aisleArray];
    for (int i=0; i<[tempArray count]; i++) {
        if ([[tempArray objectAtIndex:i] count] == 0) {
            [aisleArray removeObjectAtIndex:i];
        }
    }
    [self.tableView reloadData];
    

    为此,这两种方法应该是:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return [aisleArray count];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [[aisleArray objectAtIndex:section] count];
    }
    

    (未经测试)

    【讨论】:

      【解决方案3】:

      只需获取该部分的表 haderview 并将其从其超级视图中删除,而 tableView 不管理它。

      UIView *mysteriousView = [tableView headerViewForSection:indexPath.section];
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
      [mysteriousView removeFromSuperview];
      

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        几年后我面临同样的问题...删除最后一节不会从表格视图中删除最后一节标题。

        然而,我注意到剩余的标题正好在正常表格视图内容的下方。 因此,对我有用的解决方法(快速但您可以轻松地将其转换为 Objective C)是这样的:

        DispatchQueue.main.async {
            let unwantedViews = self.tableView.subviews.filter{ $0.frame.minY >= self.tableView.contentSize.height}
            unwantedViews.forEach{ $0.isHidden = true }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-22
          • 1970-01-01
          • 2017-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-08
          相关资源
          最近更新 更多