2013-02-23 17 views
6

Ho un'app per iPad che utilizza un UISplitViewController (con UITableView a sinistra e una vista di dettaglio a destra). La mia vista tabella evidenzia la cella selezionata in blu quando si tocca su di essa.Evidenziare in modo programmatico la cella UITableView

Quando chiamo il seguente metodo, la cella è selezionata, ma non evidenziata in blu:

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

ho passato letteralmente giorni armeggiare con i vari metodi delegato e hack cercando di ottenere il cellulare per evidenziare programatically solo come se fosse stato tappato. Non posso farlo

Sono riuscito a quasi arrivare a questo:

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

Funziona finché ho anche questo (altrimenti rimane selezionato anche quando si tocca un'altra cella):

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

So che questa è una soluzione strana e complicata. Non mi dispiacerebbe, ma non funziona nemmeno completamente. La cella selezionata perde la sua evidenziazione se viene spostata fuori dallo schermo, mentre una cella che è stata toccata rimane evidenziata quando viene fatta scorrere fuori dallo schermo.

Sono assolutamente sconcertato da questo. Sono sicuro che questa soluzione alternativa non dovrebbe nemmeno essere necessaria, che esiste una soluzione molto più semplice.

+0

Hai provato a utilizzare il metodo 'setHighlighted: animated:' di 'UITableViewCell'? (Inoltre, nel codice che includi qui, non mostri come lo stai effettivamente facendo notare. Cioè cosa succede quando imposti 'shouldHighlightCell'?) – lnafziger

+0

Hai scritto, che la cella è selezionata ma non evidenziata dopo questa chiamata. Come lo controlli? – NoilPaw

+0

So che la cella è selezionata perché la sua vista dettagliata è visualizzata a destra della mia vista divisa. – beev

risposta

0

Ho trovato questo completamente non risolvibile utilizzando tutte le possibilità conosciute. Alla fine l'ho risolto scaricando un sacco di codice e passando a NSFetchedResultsController. NSFetchedResultsController è stato introdotto poco dopo aver originariamente scritto questa app e semplifica enormemente il processo di utilizzo dei dati di base con UITableViews. https://developer.apple.com/library/IOs/documentation/CoreData/Reference/NSFetchedResultsController_Class/index.html

9

Accertarsi che il numero della cella selectionStyle sia UITableViewCellSelectionStyleBlue e che il valore allowsSelection di TableView sia impostato su YES.

Il metodo selectRowAtIndexPath:animated:scrollPosition: funziona correttamente per me. Evidenzia la cella selezionata.

+0

Grazie. Ho controllato entrambi questi valori e sono come dovrebbero essere. – beev

0

Ho trovato questo e funziona per me (aka chiamando il metodo delegato didSelectRowAtIndexPath)

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

PS. Sto usando UITableViewController.

0

ottiene il backgroundview con bordo della cella cercando come seperator.Do non modificare le impostazioni predefinite in Tableview interfaccia builder.Make sicuro UITableViewCellSelectionStyleNone non è impostato su selectionstyle. Sto incollando il codice funzionante. :

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

Ho anche provato molti approcci per ottenere la selezione iniziale da visualizzare sul mio UITableView selezione singola. Ciò che alla fine ha funzionato per me è stato quello di rinviare la selezione della riga iniziale fino al tavolo è stato istituito chiamando nel mio viewDidAppear di UITableViewController:

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

ho passato ed ho provato tutte queste ed altre soluzioni e nessuna gioia. Nel mio caso il problema (che mi ha fatto impazzire per 2 ore) è stato il seguente - poco dopo ho chiamato selectRowAtIndexPath, stavo chiamando reloadData su tableview. Quel reload stava cancellando tutte le evidenziazioni! Attenzione a questa trappola!Con l'inutile ricarica delle chiamate dati perse, l'evidenziazione è avvenuta come previsto.

Problemi correlati