2013-02-23 20 views
6

Mam aplikację na iPada, która używa kontrolera UISplitViewController (z UITableView po lewej stronie i widokiem szczegółów po prawej). Mój widok tabeli podświetla zaznaczoną komórkę na niebiesko po dotknięciu jej.Programowo wyróżnij komórkę UITableView

Kiedy wywołać następującą metodę, komórka jest zaznaczona, ale nie podświetlony na niebiesko:

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

spędziłem dosłownie dzień bawiąc się różnymi metodami delegowanego i hacki próbuje komórkę, aby podświetlić programowo tylko jakby był podsłuchany. Nie mogę tego zrobić.

udało mi się prawie tam dostać z tym:

- (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; 
     } 
    } 
} 

To działa tak długo, jak mam to również (w przeciwnym razie pozostaje on wybrany, nawet gdy inna komórka jest na podsłuchu):

- (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; 
} 

Wiem, że to dziwne i zawiłe obejście. Nie miałbym nic przeciwko, ale nawet nie działa w pełni. Wybrana komórka traci swoje podświetlenie, jeśli jest przewijana poza ekranem, podczas gdy komórka, która została dotknięta, pozostaje podświetlona po przewinięciu poza ekranem.

Jestem absolutnie zaskoczony tym. Jestem pewien, że to obejście nie będzie nawet konieczne, że istnieje o wiele prostsze rozwiązanie.

+0

Czy próbowałeś użyć metody 'setHighlighted: animated:' z 'UITableViewCell'? (Również w tym kodzie, który tutaj umieścisz, nie pokazujesz, jak naprawdę to podkreślasz, np. Co się stanie, gdy ustawisz 'shouldHighlightCell'?) – lnafziger

+0

Napisałeś, że komórka jest zaznaczona, ale nie podświetlona po to wezwanie. Jak to sprawdzasz? – NoilPaw

+0

Wiem, że komórka jest wybrana, ponieważ jej szczegółowy widok jest wyświetlany po prawej stronie mojego podzielonego widoku. – beev

Odpowiedz

0

Stwierdziłem, że jest to całkowicie niemożliwe do usunięcia przy użyciu wszystkich znanych możliwości. W końcu naprawiłem to, odrzucając dużo mojego kodu i przełączając zamiast tego na NSFetchedResultsController. NSFetchedResultsController został wprowadzony wkrótce po tym, jak napisałem tę aplikację, co znacznie upraszcza proces używania danych podstawowych za pomocą UITableViews. https://developer.apple.com/library/IOs/documentation/CoreData/Reference/NSFetchedResultsController_Class/index.html

9

Należy się upewnić, że komórka ma numer selectionStyle i tableView. Jest ona ustawiona na .

Metoda selectRowAtIndexPath:animated:scrollPosition: działa dobrze dla mnie. Podświetla wybraną komórkę.

+0

Dzięki. Sprawdziłem obie te wartości i są one takie, jakie być powinny. – beev

0

znalazłem to i to działa na mnie (aka wywołanie metody delegata didSelectRowAtIndexPath)

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

PS. Używam UITableViewController.

0

on dostaje backgroundview z ramką komórka patrząc jak seperator.Do nie zmienić domyślne ustawienia Tableview interfejs builder.Make pewno UITableViewCellSelectionStyleNone nie jest ustawiony do selectionstyle. Wklejam działający kod. :

- (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; 
} 
2

Próbowałem również wiele podejść, aby uzyskać początkowy wybór do wyświetlania na moim pojedynczego wyboru UITableView. Co ostatecznie pracował dla mnie było odroczyć wybór początkowej rzędu aż tabela została utworzona poprzez wywołanie go w moim viewDidAppear UITableViewController za:

override func viewDidAppear(animated: Bool) 
{ 
    tableView.selectRowAtIndexPath(indexPathToSelectInitially, animated: false, scrollPosition: .None) 
} 
2

przeszedłem i próbowałem wszystkie te i inne rozwiązania i nie radość. W moim przypadku problem (który doprowadził mnie do szału przez 2 godziny) był następujący - krótko po tym, jak zadzwoniłem pod numer selectRowAtIndexPath, zadzwoniłem pod numer reloadData na tableview. To przeładowanie wyczyściło wszystkie podświetlenia! Strzeż się tej pułapki!Po niepotrzebnym ponownym wczytaniu połączenia danych podświetlenie zostało wykonane zgodnie z oczekiwaniami.

Powiązane problemy