2009-08-22 5 views
1

Ich habe einen Stapel von UITableViews von einem UINavigationController verwaltet. Wenn ich auf einem der vorherigen UITableViews versuchen Aufruf indexPathForSelectedRow, habe ich immer nil:indexPathForSelectedRow auf früheren UITableViews gibt immer Null zurück?

NSEnumerator *e = [[navigationController viewControllers] objectEnumerator]; 
UITableViewController *controller; 
while (controller = [e nextObject]) { 
    NSIndexPath *selectedIndexPath = [[controller tableView] indexPathForSelectedRow]; // always nil 
    // ... 
}

Ich kann nichts über dieses Verhalten in Apples docs finden; ist es beabsichtigt? Wenn ja, gibt es einen anderen Weg, um das zu tun, was ich zu tun versuche, ohne dass ich manuell auf eine redundante mySelectedIndexPath-Instanzvariable innerhalb von didSelectRowAtIndexPath oder so etwas zurückgreifen muss?

+0

Dies sollte funktionieren. Vielleicht referenziert navigationController nicht das richtige Objekt. Wie bekommen Sie den navigationContoller in die Ansichten, die Sie auf den Stapel schieben? – VoidPointer

Antwort

1

Eine nicht sichtbare Ansicht in einem UINavigationController Stapel kann jederzeit entladen werden. Daher können Sie sich nicht auf den Status nicht sichtbarer Ansichten verlassen.

Es ist durchaus möglich, dass die UITableViewController, auf die Sie verweisen, ihre Tabellenansicht bereits entladen hätte. In diesem Fall wird das Aufrufen von [controller tableView] eine neue Ansicht instanziieren.

+0

Interessant; Danke für die Information. Ist das irgendwo dokumentiert? –

+0

Siehe den Abschnitt Speicherverwaltung in der UIViewController-Dokumentation. – Darren

1

Ich bemerkte dies auch auf dem iPad, in einer Split-Screen-Ansicht (links, rechts Detailfenster), und es ist irgendwie nervig. Ich habe jedoch festgestellt, dass Sie, wenn Sie viewWillAppear überschreiben, die ausgewählte Zeile für die Tabellenansicht abrufen können, bevor Sie aufrufen [super viewWillAppear];

Also, wenn Sie einen Code wie dies hätte, würde indexPathForSelectedRow gleich Null,

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    if(![_self.tableView indexPathForSelectedRow]) 
    { 
     NSLog(@"nothing selected, so selecting 1st one"); 
      // sets the detail pane here. 
    } 
} 

aber wenn der Code wie folgt war (die viewWillAppear beachten Sie: am Ende), dann indexPathForSelectedRow würde nicht gleich null.

- (void)viewWillAppear:(BOOL)animated { 
    if(![_self.tableView indexPathForSelectedRow]) 
    { 
     NSLog(@"nothing selected, so selecting 1st one"); 
       // sets the detail pane here. 
    } 
    [super viewWillAppear:animated]; 
} 
+0

Hackish, aber es funktioniert –

+0

Der einzige Grund, dies scheint zu funktionieren, weil Sie einen UITableViewController und ClearSelectionOnViewWillAppear Standardwerte auf JA verwenden. Sie sollten clearsSelectionOnViewWillAppear auf NO setzen und dann können Sie auf die ausgewählte Zeile zugreifen, wie Sie möchten, ohne befürchten zu müssen, dass der UITableViewController sie für Sie abwählen wird. –

Verwandte Themen