22

テーブルをスクロールするときに、テーブルビューセルが「選択された」状態を維持しないという問題があります。関連するコードは次のとおりです。

@property (nonatomic, strong) NSIndexPath *selectedIndexPath;

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.selectedIndexPath = indexPath;
    //do other stuff
}

-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    MyCustomCell_iPhone* cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell_iPhone"];

    if (cell == nil)
        cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil] objectAtIndex:0];

    if ([indexPath compare: self.selectedIndexPath] == NSOrderedSame) {
        [cell setSelected:YES animated:NO];
    }

    return cell;
}

そしてセルの場合:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if (selected) {
        self.selectedBg.hidden = NO;
    }else{
        self.selectedBg.hidden = YES;
    }
}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        self.selectedBg.hidden = NO;
    }else{
        self.selectedBg.hidden = YES;
    }
}

選択したセルを強調表示したままにするにはどうすればよいですか?画面からスクロールして外すと、画面をスクロールして戻ると、選択されていない状態で表示されます(selectedBgは非表示になっています)。

編集:セルからsetHighlightedメソッドを削除すると、問題が修正されます。ただし、これは、テーブルセルを押したときに強調表示された状態が表示されないことを意味します。これに対する解決策を知りたいのですが。

4

12 に答える 12

8

私の方法はあまり正統的ではありませんが、うまくいくようです。これが私の解決策です:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if cell.selected {
        cell.selected = true
    } else {
        cell.selected = false
    }
}

投稿で言及したすべてのメソッドも実装する必要があります (@soleil)

于 2014-11-30T20:13:14.057 に答える
2

iOS 7/8 は両方とも、スクロールが始まるとセルの選択を解除します (Alexander Larionov が指摘したように)。

私にとってより簡単な解決策は、ViewController にこの UIScrollViewDelegate メソッドを実装することでした。

 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
     NSInteger    theRow       = [self currentRowIndex]; // my own method
     NSIndexPath *theIndexPath = [NSIndexPath indexPathForRow:theRow inSection:0];
     [self.myTableView selectRowAtIndexPath:theIndexPath 
                                   animated:NO 
                             scrollPosition:UITableViewScrollPositionNone];
 }

私のviewControllerはUITableViewのデリゲートであり、UITableViewはUIScrollViewを継承しているため、これは機能します。

于 2015-01-29T23:36:53.830 に答える
0

ここに簡単な回答を投稿しました: https://stackoverflow.com/a/35605984/3754003

その中で、なぜこれが起こるのかについても説明します。

于 2016-02-24T15:21:54.467 に答える
0

UITableViewCell には BOOL プロパティ " selected " があります。セルをロードするときはいつでも、cellForRowAtIndexPath 定義で次のように、選択された状態を確認し、それに応じて選択または選択解除を行います。

if (cell.selected) {
    // Maintain selected state
}
else{
     // Maintain deselected state
}
于 2015-02-18T16:32:30.133 に答える
0

インデックス パス オブジェクト全体ではなく、インデックス パスの行を比較してみましたか?

if ((indexPath.row == self.selectedIndexPath.row) && (indexPath.section == self.selectedIndexPath.section)) {
    [cell setSelected:YES animated:NO];
}
于 2012-11-07T18:03:19.343 に答える
0

これが私が思いついた解決策です — そしてそれはハックとも感じません.

1)スクロール中に選択された行(ある場合)のセルを実装-scrollViewWillBeginDragging:して手動で強調表示します。-scrollViewWillEndDragging:withVelocity:targetContentOffset:

私は次のように見えます:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollview {
    self.scrollViewIsDragging = YES;

    if( [self.tableView indexPathForSelectedRow] ) {
        [[self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]] setHighlighted:YES];
    }
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    self.scrollViewIsDragging = NO;

    if( [self.tableView indexPathForSelectedRow] ) {
        [[self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]] setHighlighted:NO];
    }
}

このscrollViewIsDraggingプロパティは-tableView:cellForRowAtIndexPath:、新しくキューから取り出されたセルが適切に強調表示されていることを確認できるようにするためのものです (たとえば、選択した行のセルが画面から離れた後に画面にスクロールされた場合)。そのメソッドの関連部分は次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // ... cell creation/configuration ...

    if( self.scrollViewIsDragging && [[tableView indexPathForSelectedRow] isEqual:indexPath]) {
        [cell setHighlighted:YES animated:NO];
    }

}

…そして、あなたはそれを持っています。selectedRow のセルは、スクロール中に強調表示されたままになります。

于 2014-05-31T01:55:17.263 に答える