Selecteer de rij met tabelweergave programmatisch

Hoe selecteer ik programmatisch een rij UITableViewzodat

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath

wordt geëxecuteerd? selectRowAtIndexPathzal alleen de rij markeren.


Antwoord 1, autoriteit 100%

Zoals Jaanus vertelde:

Deze (-selectRowAtIndexPath:animated:scrollPosition 🙂 methode aanroepen
zorgt er niet voor dat de gedelegeerde een ontvangt
tableView:willSelectRowAtIndexPath: of
tableView:didSelectRowAtIndexPath: bericht, noch zal het verzenden
UITableViewSelectionDidChangeNotification-meldingen voor waarnemers.

Je hoeft dus alleen de methode delegatezelf aan te roepen.

Bijvoorbeeld:

Swift 3-versie:

let indexPath = IndexPath(row: 0, section: 0);
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)

ObjectiveC-versie:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath 
                            animated:YES 
                      scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

Swift 2.3-versie:

let indexPath = NSIndexPath(forRow: 0, inSection: 0);
 self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
 self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath)

Antwoord 2, autoriteit 97%

Van referentiedocumentatie:

Het aanroepen van deze methode zorgt er niet voor dat de gemachtigde een tableView:willSelectRowAtIndexPath:of tableView:didSelectRowAtIndexPath:bericht ontvangt, en het verzendt ook geen UITableViewSelectionDidChangeNotificationmeldingen aan waarnemers.

Wat ik zou doen is:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self doSomethingWithRowAtIndexPath:indexPath];
}

En dan, vanaf waar je selectRowAtIndexPath wilde aanroepen, roep je in plaats daarvan doSomethingWithRowAtIndexPath aan. Bovendien kunt u ook selectRowAtIndexPath aanroepen als u wilt dat de UI-feedback plaatsvindt.


Antwoord 3, autoriteit 54%

UITableView’s selectRowAtIndexPath:animated:scrollPosition:zou het lukken.

Geef gewoon UITableViewScrollPositionNonedoor voor scrollPosition en de gebruiker zal geen beweging zien.


U zou de actie ook handmatig moeten kunnen uitvoeren:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

nadat je selectRowAtIndexPath:animated:scrollPosition:hebt geselecteerd, zodat de markering plaatsvindt, evenals alle bijbehorende logica.


Antwoord 4, autoriteit 18%

als je een rij wilt selecteren, zal dit je helpen

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath 
                           animated:NO 
                     scrollPosition:UITableViewScrollPositionNone];

Hiermee wordt de rij ook gemarkeerd.
Delegeer dan

[someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

Antwoord 5, autoriteit 16%

Snelle 3/4/5 oplossing

Selecteer rij

let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)

Deselecteer rij

let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)

Antwoord 6, autoriteit 3%

Er zijn twee verschillende methoden voor iPad- en iPhone-platforms, dus u moet beide implementeren:

  • selectie handler en
  • seg.

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    // Selection handler (for horizontal iPad)
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    // Segue (for iPhone and vertical iPad)
    [self performSegueWithIdentifier:"showDetail" sender:self];
    

Antwoord 7, autoriteit 3%

Gebruik deze categorie om een ​​tabelrij te selecteren en een bepaalde reeks na een vertraging uit te voeren.
Roep dit aan binnen uw viewDidAppearmethode:

[tableViewController delayedSelection:withSegueIdentifier:]
@implementation UITableViewController (TLUtils)
-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID {
    if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];                                                                                                                                                                 
    [self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];                                                                                               
}
-(void)selectIndexPath:(NSDictionary *)args {
    NSIndexPath *idxPath = args[@"NSIndexPath"];                                                                                                                                                                                         
    [self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];                                                                                                                            
    if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
        [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];                                                                                                                                              
    [self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];                                                                                                                                                            
}
@end

Other episodes