3

テーブル編集モードをオフにした後もまだ表示されているという奇妙な問題がありeditingAccessoryViewます。UITableViewCell

現在UISwitch、編集アクセサリビューとしてを使用しており、ナビゲーションバーの編集ボタンが押されたときに、テーブルビューにアニメーション付きの編集ビューのオン/オフ画面の移動を処理させています。

ほとんどすべての編集アクセサリビューは画面外で正しくアニメーション化されますが、画面外に完全に表示されないものが常に2つあり、セルがデキューされて再利用されると再利用されるため、スクロール中に表示されます。

他の誰かがこれを見たことがありますか、それとも私がここで見逃しているものがありますか?

私はこのようにセルを設定しています:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    AllStatCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AllStatCell"];

    if (cell.editingAccessoryView == nil) {
        UISwitch *statSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
        [statSwitch addTarget:self action:@selector(saveSwitchState:) forControlEvents:UIControlEventValueChanged];
        cell.editingAccessoryView = statSwitch;
    }

    NSString *statName = [self statNameForIndexPath:indexPath];
    cell.statName.text = statName;
    [(UISwitch *)cell.editingAccessoryView setOn:[self switchValueForIndexPath:indexPath withStatNamed:statName]];

    if (tableView.editing) cell.statValue.hidden = YES;

    return cell;
}

アニメーションが完了するのを許可するために、遅延後にテーブルデータをリロードするメソッドをオーバーライドしようとしsetEditingましたが、それは時々しか機能しません

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];

    // Insert/delete the stat rows depending on editing mode
    [self rebuildTableDataAnimated:YES];

    double delayInSeconds = 0.5;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        // Trying to fix bug that shows part of a UISwitch on screen still even though editing mode is completed
        [self.tableView reloadData];
    });
}

スクリーンショットは次のとおりです。

バグ画像

4

2 に答える 2

1

古いスレッドですが、UIStepperを使用したXcode7でも同じ問題が発生します。私の解決策は、左右にパディングを付けてUIViewに埋め込み、親ビューをeditingAccessoryViewに設定することでした。それは機能し、ハックではありません。

于 2015-09-21T21:31:21.450 に答える
0

これはそのようなハックのように感じるので、うまくいけば、他の誰かがそれに対するより良い修正を持っています:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    AllStatCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AllStatCell"];

    NSString *statName = [self statNameForIndexPath:indexPath];

    // Hack fix for a bug that shows part of a UISwitch on screen still even though editing mode is completed
    // Configure stat on/off switches
    cell.editingAccessoryView = [self cellEditingAccessoryViewForEditing:tableView.editing];
    if (tableView.editing) [(UISwitch *)cell.editingAccessoryView setOn:[self switchValueForIndexPath:indexPath withStatNamed:statName]];

    cell.statName.text = statName;
    [cell.statValue setHidden:tableView.editing];

    return cell;
}

// Hack fix for a bug that shows part of a UISwitch on screen still even though editing mode is completed
- (UISwitch *)cellEditingAccessoryViewForEditing:(BOOL)tableIsEditing
{
    if (tableIsEditing) {
        UISwitch *statSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
        [statSwitch addTarget:self action:@selector(saveSwitchState:) forControlEvents:UIControlEventValueChanged];
        return statSwitch;
    }
    return nil;
}
于 2013-03-02T15:54:28.153 に答える