1

UITableViewカスタム セクション ヘッダー ビューを含むを作成しました。ここで、現在表示されている一番上のセクションにもう少しデータを表示したいと思います。scrollViewDidEndDeceleratingこのイベントを使用して、セクション ヘッダーを更新する予定です。現在、問題は、特定のセクション番号のセクション ヘッダーの高さを設定できないことです。

事前に使用してみheightForHeaderInSectionましたが、アプリは次の出力でクラッシュします。

'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

私はコードを使用していました:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (tableView == self.tableView)
    {
        NSArray *visibleCells = [self.tableView visibleCells];
        NSMutableArray *visibleSections = [[NSMutableArray alloc] init];
        for (NSInteger index = 0; index < [visibleCells count]; index++)
        {
            UITableViewCell *currentCell = [visibleCells objectAtIndex:index];
            NSIndexPath *currentPath = (NSIndexPath *)[self.tableView indexPathForCell:currentCell];
            if (![visibleSections containsObject:[NSNumber numberWithInt:currentPath.section]])
            {
                [visibleSections addObject:[NSNumber numberWithInt:currentPath.section]];
                NSLog([NSString stringWithFormat:@"%ld", (long)[visibleSections count]]);
                [visibleSections sortedArrayUsingDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:nil ascending:YES]]];
            }
        }
        if (visibleSections == nil)
        {
            return 42.0;
        }
        else if ([[visibleSections objectAtIndex:0] integerValue] == section)
        {
            return 58.0;
        }
        else
        {
            return 42.0;
        }
    }
}

heightForHeaderInSectionメソッドの何が問題だったのかはよくわかりませんでしたがNSMutableArray、visibleSections と関係があることはわかっていました。

外部の特定のセクション ヘッダー ビューの高さを変更する方法、および/または上記のコードを修正する方法に関するヒントや回答は、heightForHeaderInSection非常に役立ちます。

編集:

クラッシュの問題の解決策を少し明確にするために、またはif (visibleSections == nil)の代わりに使用しないでください。if ([visibleSections count] < 1)if ([visibleSections count] == 0)

4

4 に答える 4

1

テーブルが最初に表示されたときに最初のセクション ヘッダーを高くしたい場合は、次のようにすることもできると思います (topSection は NSInteger プロパティです)。

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    self.topSection = ((NSIndexPath *)[self.tableView indexPathsForVisibleRows][0]).section;
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:self.topSection] withRowAnimation:NO];
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {

        if (self.topSection == section)
        {
            return 58.0;
        }
        else
        {
            return 42.0;
        }
}
于 2013-04-06T18:08:15.383 に答える
0

わかりました。これは最初に思われたよりも難しい問題であることがわかりました。これまでに思いついた最高のものは

  • 上部セクションのヘッダーを別のものとして扱わず、それらすべてに余分なデータを入力してください。
  • 「追加」アイテムを巧みに配置して、小さいときに親ビューの境界の外になるようにし、親ビューを作成することで、さまざまな部分を表示および非表示にすることができますclipToBounds
  • カスタムUIViewサブクラスを作成して何らかの操作を行うことができない場合layoutSubviews

私が落ち着いていた最終的な実装はこれでした

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
  NSArray *indexPaths = [self.tableView indexPathsForVisibleRows];
  self.topSection = [indexPaths count] ? [indexPaths[0] section] : -1;
  if (indexPaths.count > 1) {
    self.topSection = [indexPaths[1] section];
  }

  [self.tableView beginUpdates];
  [self.tableView endUpdates];
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
{
  if (section <= self.topSection) {
    return 60;
  } else {
    return 20;
  }
}

それは決して完璧ではありませんが、ある程度合理的に見え、微調整することができました.

注意事項:

  • 進行中の作業が多すぎるかどうかを評価する必要があるかもしれscrollViewDidScroll:ませんが、遅延が発生しているようには見えませんでした (実際には適切にテストしていません)。
  • indexPath利用可能な場合は 2 番目を使用してトップ セクションを設定しました。
  • 私が使用するsection <= self.topSectionのは、ヘッダーのビフォアがすべて画面のすべてであるため、サイズを縮小しても意味がなく、アニメーションが非常に不格好になるためです。

したがって、これを試した後、さらに深く掘り下げたり、デザインを少し再考したりする必要があるかもしれません

于 2013-04-06T21:37:24.760 に答える
0

objectAtIndex:0 を呼び出して配列の最初のオブジェクトを直接参照することはできません。防御を維持する必要があるため、次のように変更します。

else if ([[visibleSections objectAtIndex:0] integerValue] == section)
    {
        return 58.0;
    }

else if([visibleSections count]>0)
    {
      if ([[visibleSections objectAtIndex:0] integerValue] == section)
        {
           return 58.0;
        }
     }
于 2013-04-06T17:04:49.337 に答える
-1

この行を変更してみてください:

NSMutableArray *visibleSections = [[NSMutableArray alloc] init]

に:

NSMutableArray *visibleSections = [NSMutableArray array];

配列を初期化します。

于 2013-04-06T17:02:01.710 に答える