8

UISplitViewControllerを使用するiPadアプリがあります(左側にUITableView、右側に詳細ビューがあります)。テーブルビューでは、選択したセルをタップすると青色で強調表示されます。

次のメソッドを呼び出すと、セルは選択されていますが、青色で強調表示されていません。

[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

私は文字通り、セルがタップされたかのようにプログラムでセルを強調表示するために、さまざまなデリゲートメソッドやハックをいじくり回してきました。できません。

私はこれでほとんどそこに到達することができました:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (shouldHighlightCell)
    {
        NSIndexPath *indexPathForCellToHighlight = [NSIndexPath indexPathForRow:0 inSection:0];

        if ([indexPath isEqual:indexPathForCellToHighlight])
        {
            cell.selected = YES;
            shouldHighlightCell = NO;
        }
    }
}

私がこれを持っている限り、それは機能します(そうでなければ、別のセルがタップされても選択されたままになります):

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *ip = [NSIndexPath indexPathForRow:0 inSection:0];

    if ([[self.tableView cellForRowAtIndexPath:ip] isSelected])
    {
        [[self.tableView cellForRowAtIndexPath:ip] setSelected:NO];
    }

    NSIndexPath *iToTheP = indexPath;
    return iToTheP;
}

私はこれが奇妙で複雑な回避策であることを知っています。私は気にしませんが、それは完全には機能しません。選択したセルは、画面からスクロールするとハイライトが失われますが、タップされたセルは、画面からスクロールするとハイライトされたままになります。

私はこれに絶対に困惑しています。この回避策は必要ないはずであり、はるかに簡単な解決策があると確信しています。

4

6 に答える 6

11

セルselectionStyleがでUITableViewCellSelectionStyleBlueあり、tableViewallowsSelectionがに設定されていることを確認してくださいYES

この方法selectRowAtIndexPath:animated:scrollPosition:は私にとってはうまくいきます。選択したセルが強調表示されます。

于 2013-02-23T20:32:49.070 に答える
3

私はこれらすべての解決策や他の解決策を試しましたが、喜びはありませんでした。私の場合、問題(2時間私を狂わせた)は次のとおりでした-私が電話をかけた直後にselectRowAtIndexPath、私はを電話reloadDataしていましたtableview。そのリロードはすべてのハイライトを一掃していました!この落とし穴に注意してください!データ呼び出しの不要なリロードがなくなると、期待どおりに強調表示が行われました。

于 2016-06-06T09:25:29.043 に答える
2

また、単一選択のUITableViewに表示する最初の選択を取得するために、多くのアプローチを試しました。最終的に私のために働いたのは、UITableViewControllerのviewDidAppearで呼び出すことによってテーブルが設定されるまで、最初の行の選択を延期することでした。

override func viewDidAppear(animated: Bool)
{
    tableView.selectRowAtIndexPath(indexPathToSelectInitially, animated: false, scrollPosition: .None)
}
于 2015-03-04T08:53:17.857 に答える
1

私はこれを見つけました、そしてそれは私のために働きます(別名デリゲートメソッドdidSelectRowAtIndexPathを呼び出す)

NSIndexPath *defaultIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self tableView:[self tableView] didSelectRowAtIndexPath:defaultIndexPath];

PS。UITableViewControllerを使用しています。

于 2013-07-02T17:09:36.400 に答える
0

私はこれがすべての既知の可能性を使用して完全に修正できないことを発見しました。結局、私は多くのコードを捨てて、代わりにNSFetchedResultsControllerに切り替えることでそれを修正しました。NSFetchedResultsControllerは、私がこのアプリを最初に作成した直後に導入され、UITableViewsでCoreDataを使用するプロセスを大幅に簡素化します。 https://developer.apple.com/library/IOs/documentation/CoreData/Reference/NSFetchedResultsController_Class/index.html

于 2014-11-05T13:23:31.060 に答える
0

セルの境界線が区切り文字のように見える背景ビューを取得します。InterfaceBuilderのデフォルトのテーブルビュー設定を変更しないでください。UITableViewCellSelectionStyleNoneがselectionstyleに設定されていないことを確認してください。作業コードを貼り付けています。:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *kCellIdentifier = @"PlayListCell";
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellIdentifier];
    }
    MPMediaPlaylist *playList = [playlistCollection objectAtIndex:indexPath.row];
    cell.textLabel.text = playList.name;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
     // cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%d Songs",[playList.items count]];
    MPMediaItemCollection *playListMediaCollection = [playlistCollection objectAtIndex:indexPath.row ];

    cell.imageView.image =[UIImage imageWithCGImage:[self getImageForCollection:playListMediaCollection.items]];

    // the main code which make it highlight

    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:170.0f/255.0 green:170.0f/255.0 blue:170.0f/255.0 alpha:1.0f];
    [bgColorView.layer setBorderColor:[UIColor blackColor].CGColor];
    [bgColorView.layer setBorderWidth:1.0f];
    [cell setSelectedBackgroundView:bgColorView];
    return cell;
}
于 2014-12-30T09:26:33.713 に答える