2010-01-09 19 views
116

Wie kann ich eine UITableView Zeile programmatisch auszuwählen, so dassWählen Sie Tableview Zeile programmatisch

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

ausgeführt wird? selectRowAtIndexPath wird nur die Zeile markieren.

+0

Ich stieß auf das gleiche Problem und nur die Verknüpfung: http://stackoverflow.com/questions/5324501/select-tableviews-row-from-an-another-view Ich hoffe, es wird für Sie hilfreich sein. – michael

Antwort

103

Von reference documentation:

Aufruf diese Methode führt nicht zu den Delegierten eine tableView:willSelectRowAtIndexPath: oder tableView:didSelectRowAtIndexPath: Nachricht zu empfangen, noch UITableViewSelectionDidChangeNotification Benachrichtigungen an Beobachtern schicken.

Was ich tun würde, ist:

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

Und dann, von wo aus man wollte selectRowAtIndexPath anrufen, rufen Sie stattdessen doSomethingWithRowAtIndexPath. Darüber hinaus können Sie zusätzlich selectRowAtIndexPath aufrufen, wenn das Benutzeroberflächenfeedback stattfinden soll.

+3

Oder wenn Sie die Zeile programmgesteuert auswählen, können Sie tableView: didSelectRowAtIndexPath: self (in der Klasse, die Sie als Delegat verdrahtet haben) aufrufen. –

+2

Diese Methode scheint mir ein Hack zu sein, sie hat den Job erledigt, aber ich denke, es sollte einen besseren Weg geben. –

+1

Ich glaube nicht, dass Sie einen Aufruf "doSomethingWithRowAtIndexPath" erstellen müssen. Können Sie nicht einfach die Delegate-Methode aufrufen und die Argumente übergeben, die Sie zum Ausführen der didSelect-Logik von dem Ort benötigen, an dem Sie die Delegate-Methode implementiert haben? – ImpactZero

63

UITableView selectRowAtIndexPath:animated:scrollPosition: sollte den Trick tun.

Pass einfach UITableViewScrollPositionNone für scrollPosition und der Benutzer wird keine Bewegung sehen.


Sie sollten auch in der Lage sein, manuell die Aktion auszuführen:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

nach selectRowAtIndexPath:animated:scrollPosition: so das Highlight sowie eine damit verbundene Logik geschieht.

+0

Entschuldigung, das ist was ich benutze. Ich habe versehentlich scrollToRowAtIndexPath eingefügt. Ich habe die Frage aktualisiert. scrollToRowAtIndexPath hebt nur die Zelle hervor. – 4thSpace

+2

Ja, es tut mir leid. Es sagt, dass es didSelectRowAtIndexPath nicht direkt in dem Dokument-Link, den ich gepostet habe, auslöst. Ich muss lesen lernen. – anq

+0

@anq: Vielen Dank! Es hilft mir, wenn ich den didSelectRowAtIndexPath: indexPath in der benutzerdefinierten Zelle aufruft. – Bentley

2

Verwenden Sie diese Kategorie, um eine Tabellenzeile auszuwählen und einen bestimmten Übergang nach einer Verzögerung auszuführen.
Rufen Sie diese in Ihrem viewDidAppear Methode:

[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 
+2

Die Frage hatte nichts mit Übergängen zu tun. –

+0

Ja, über nichts in Ihrer Antwort bezieht sich auf die Frage – dulgan

+2

Schätzen Sie diese Antwort. Dies funktioniert perfekt, wenn der Benutzer dasselbe Verhalten erreichen möchte, aber Storyboards verwendet. –

88

Wie Jaanus gesagt:

diese (-selectRowAtIndexPath Aufruf: animated: scroll :) Methode nicht der Delegat verursacht einen Tableview erhalten: willSelectRowAtIndexPath: oder tableView: didSelectRowAtIndexPath: message, noch sendet es UITableViewSelectionDidChangeNotification-Benachrichtigungen an Beobachter.

So müssen Sie nur die delegate Methode selbst aufrufen.

Zum Beispiel:

Swift 3-Version:

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

ObjectiveC Version:

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

Swift 2.3 Version:

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

Großartig, danke! +1 – edzio27

+1

Danke, Kumpel! Gute Eins. – Felipe

2

Es gibt zwei verschiedene Methoden für iPad und iPhone-Plattformen, so müssen Sie beide implementieren:

  • Auswahl-Handler und
  • segue.

    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]; 
    
19

, wenn Sie einige Zeile auswählen möchten dieses Sie Dies wird auch die Reihe Hervorgehoben

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

helfen. Dann delegieren

[someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath]; 
6

Swift 3.0 Lösung

Select Row

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

DESELECT Row

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