web-dev-qa-db-ja.com

スワイプしてセルを削除すると、tableViewHeaderがセルとともに移動します

IOS 8のtableViewHeaderUITableViewの奇妙なバグに遭遇しました。削除ボタンを表示するためにセルをスワイプすると(標準のiOSのスワイプ-削除)、スワイプされているセルとともにtableViewHeaderが移動します。セルをスワイプすると、スワイプされているセルと同じようにヘッダーが移動します。テーブルビューの他のセルは移動されず、ヘッダーとスワイプされているセルのみが移動されます。 iOS 7でこれをテストしましたが、問題は発生していません。私には、これはiOS 8のtableViewHeaderのバグのように見えます。これは、このバージョンでのみ発生するものであり、発生しないはずの問題のようです。ヘッダーを削除するスワイプに含める理由はありません。

以下は単なるモックアップです。アプリ内の削除するスワイプはデフォルトのiOSであり、カスタムではありません。

Below is just a mockup. Swipe-to-delete within the app is default iOS, nothing custom.

54
ferris

フェリスの答えに基づいて、UITableViewCellをセクションヘッダーとして使用する最も簡単な方法は、viewForHeaderInSectionでセルのcontentViewを返すことです。コードは次のとおりです。

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader
    return cell.contentView
    //cellSectionHeader is my subclassed UITableViewCell
}
49
Brad C

これは、テーブルのヘッダーとしてUITableViewCellを使用していたために発生しました。スワイプの問題を解決するには、tableView.tableHeaderView = cellを使用する代わりに、次を使用します。

UIView *cellView = [[UIView alloc] init];
[cellView addSubview:cell];
tableView.tableHeaderView = cellView

これがなぜ問題を解決するのかはわかりませんが、特にiOS 7で機能するという点で、問題を解決するようです。

セルのcontentViewに想定されているように、すべてのビューをセルビューに追加してください。そうしないと、ボタンが応答しなくなります。

作品:

[cell addSubview:view];または[self addSubview:view];

動作しません:

[cell.contentView addSubview:view]または[self.contentView addSubview:view]

25
ferris

セルとともにヘッダーが移動するのを防ぐ方法は、viewForHeaderInSectionでセルのcontentViewを返すことです。 SectionHeaderTableViewCellという名前のサブクラス化されたUITableViewCellがある場合、これは正しいコードです。

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"];
    //Do stuff to configure your cell
    return cell.contentView; 
}
9
bodagetta

Swift 3.テスト済みソリューション。 Objective-Cの最初の例で述べたように、キーポイントはcellではなくcell.contentViewを返すため、新しい形式の構文は次のようになります。

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    // HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype
    let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")

    cell.songLabel.text = "Your Section Name"
    return cell.contentView
}
3
Trevor

.contentViewメソッドで言及されていない問題の1つは、Table ViewセルがlayoutSubviewsを使用する場合、layoutSubviewsが呼び出されないため、希望する動作が得られない可能性があることです。最終的に、通常のセル操作とヘッダー操作の両方をサポートする完全に独立したUIViewサブクラスを作成し、それを使用する最小限のUITableViewセルクラスを作成しました。

0
Chris Prince

このメソッドを実装して、スワイプをチェックするための適切な条件を与えてみてください。このメソッドがヘッダービューに対して呼び出される場合。

1.tableView:editingStyleForRowAtIndexPath:2.tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:3.tableView:shouldIndentWhileEditingRowAtIndexPath:

0
iOSdev