2010-10-20 25 views
32

Ich folgte Luke Redpaths Vorschlag hier - Selected UItableViewCell staying blue when selected - um die Zeile abzuwählen, wenn ich zur ursprünglichen Tabellenansicht zurückkehre, aber ich kann nicht funktionieren. Tatsächlich wird die Methode nicht ausgelöst.Auswahl der Tabellenansichtszeile bei der Rückgabe abwählen

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

Ich vermute, das liegt daran, dass die Klasse nicht ein UITableViewController, sondern ein UIViewController mit den tableView als Eigenschaft mit dem NIB angeschlossen.

Wie würde ich das gleiche Verhalten bekommen - dh die Auswahl bei der Rückgabe abwählen?

+0

Es sollte nicht wichtig sein, solange das TableView korrekt angeschlossen ist. Sie sollten es in 'didSelectRowAtIndexPath:' einfügen können und es funktionieren lassen. Sie könnten auch eine schnelle NSLog-Überprüfung von dem durchführen, was '[self.tableView indexPathForSelectedRow]' zurückgibt, da es möglicherweise tatsächlich null zurückgibt. – iwasrobbed

+0

Ich benutzte dies, aber hatte ein Problem, wo Änderungen in der Zelle (Hintergrund etc) nicht sofort widergespiegelt wurde. Hinzufügen von reloadRowsAtIndexPaths: in didDeselectRowAtIndexPath: hat den Trick gemacht – nh32rg

Antwort

15

Wenn Sie ein Navigation verwenden, können Sie es mit seinem Delegierten tun:

- (void)navigationController: (UINavigationController *)navigationController 
     didShowViewController: (UIViewController *)viewController 
        animated: (BOOL)animated 
{ 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

Aber Sie müssen prüfen, ob die Show-Controller, die Sie =/

[EDIT] erstellen wollen, ist die Steckdose und verbinden Sie es in IB mit NavigationController

@interface MyInt <UINavigationControllerDelegate> 
{ 
    IBOutlet UINavigationController *navigation; 
    ... 
} 
@property (nonatomic, retain) UINavigationController *navigation; 
... 
@end 

@implementation MyInt 
@syntesize navigation; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.navigation setDelegate: self]; 
} 
... 

@end 
+0

Mein Nav-Controller ist in meiner Feder erstellt worden, also hat er keine entsprechende Klasse.Geht es darum herum? – cannyboy

+0

Sie können es einem IBOutlet-Ivar zuordnen. –

+0

Mein Setup ist, dass ich eine MainViewController-Klasse mit einer entsprechenden NIB habe. Diese Nib hat UITabBarController (auch eine IBOutlet-Eigenschaft 'tabBarController' in MainViewController). In dieser Tab-Leiste befinden sich mehrere UINavigation-Controller. Diese sind nicht im Code referenziert. Ich bin mir also nicht sicher, wie ich auf diese Nav-Controller zugreifen soll. – cannyboy

8

Wählen Sie die Zeile programmgesteuert? Wenn ja, hatte ich das gleiche Problem bei der Auswahl einer Zeile mit [cellToBeSelected setSelected:YES];.

Mit der Methode selectRowAtIndexPath:animated:scrollPosition: wurde der aktuell ausgewählte IndexPath verfolgt.

In der Tat, wenn clearsSelectionOnViewWillAppear auf True festgelegt ist, hat man Zeilen nicht manuell abwählen.

21

, warum Sie einfach nicht deaktivieren Sie es nicht in der Delegatmethode

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

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 

} 
+2

Sie müssen nicht '[self.tableView indexPathForSelectedRow]', indexPath ist bereits ein Parameter, und Sie können es einfach dort einfügen. –

+0

Wenn Sie die Delegate-Methode verwenden, sollten Sie außerdem den Parameter 'tableView' anstelle von' self.tableView' verwenden, da diese möglicherweise abweichen, wenn Sie mehrere Tabellenansichten haben. –

8

ich das gleiche Problem dafür hatten, aber nach dem Debuggen fand ich die indexPathForSelectedRow Zahl 0, so war aus Ich doppelt meinen Code überprüft und festgestellt, ich war Aufruf

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

    // some code... 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

Nach dem Löschen dieser Zeile funktionierte es nur wie erwartet.

+0

Das war ein ganz offensichtlicher Fehler, der mich erwischt hat. Ich denke, viele Leute, darunter ich selbst, setzen die Abwahl aus Gewohnheit in den Delegierten. – micnguyen

4

Sehr einfach: Versuchen Sie diese Zeile.

hinzufügen deselectRowAtIndexPath in Ihrem didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

} 
0
-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor grayColor]]; 
} 

-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor clearColor]]; 
} 
+0

Bitte beschreiben Sie, warum dies die Lösung ist. Was ist der Wechsel/Trick? –

1

Swift 3,0

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
      tableView.deselectRow(at: indexPath, animated: true) 
    //Write Your Other code Here. 
      } 

Es wird Row deaktivieren, nachdem Sie darauf klicken.

Verwandte Themen