2

Aufruf habe ich eine UITableView und im Innern mir eine benutzerdefinierte UITableViewCell im follwoing Weise erstellen:ein modales Fenster aus einem benutzerdefinierten UITableViewCell

ItemCellController *cell = (ItemCellController *)[tableView dequeueReusableCellWithIdentifier:ContentListsCellIdentifier]; 
... 
cell = [[[ItemCellController alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ContentListsCellIdentifier] autorelease]; 

ich diese touchesBegan bekommen zu tun und touchesEnded Ereignisse (so dass ich kann eine lange Berührung implementieren). NSLog Mit Ich kann sehen, dass die longTouch richtig aus dem touchesBegan Methode aufgerufen wird mit dem folgenden Code:

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(longTouch:) userInfo:nil repeats:YES]; 

Das Problem ist, dass ich nicht in der Lage bin ein modales Fenster aus dem longTouch Methode aufzurufen.

Ich habe Folgendes versucht, aber ich bekomme eine NSInvalidArgumentException - [ItemCellController navigationController]: unerkannter Selektor an Instanzfehler gesendet. Die Frage ist, wie kann ich ein modales Fenster aus einer benutzerdefinierten UITableViewCell aufrufen.

Dank

Antwort

13

Die navigationController Eigenschaft für UIViewController s existiert, aber UITableViewCell (was ich denke, ItemCellController ist eine Unterklasse von) keine UIViewController, so dass es nicht über diese Eigenschaft standardmäßig.

Es gibt ein paar appraoches:

(1) hinzufügen UIViewController* Eigenschaft (vielleicht ist es controller nennen), um Ihre individuelle Zelltyp, und übergeben Sie einen Zeiger auf dem Controller mit init-Methode (sagen wir, initWithController:) . Dann in der Zelle, können Sie einfach ausführen:

UINavigationController* navController = [ /* alloc and init it */ ] 
[self.controller presentModalViewController:navController animated:YES]; 

(2) AppDelegate Objekt könnte eine Controller-Eigenschaft, die Sie überall in Ihrem Code zugreifen können. Dann könnten Sie etwas tun:

MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate]; 
[myAppDelegate.controller presentModalViewController:navController 
              animated:YES]; 

(3) Dieser ist weniger direkt, aber flexibler. Sie könnten Ihren Root-Controller (den Sie für die Präsentation der modalen Ansicht einrichten möchten) so einrichten, dass er auf eine bestimmte Benachrichtigung wartet und diese Benachrichtigung in Ihren Tabellenzellen posten.

Probe hört Code aus Ihrem Root-Controller genannt:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(showModal:) 
              name:@"show modal" 
              object:nil]; 

Beispiel Postleitzahl, aus innerhalb einer Tabellenzelle genannt:

NSDictionary* userInfo = [ /* store a handle to your modal controller */ ]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"show modal" 
                object:self 
                userInfo:userInfo]; 

Und die showModal: Methode Ihres Root-Controller verwenden würde die userInfo in der NSNotification enthalten, um herauszufinden, welche Ansicht Controller modal präsentieren. Das ist mehr Arbeit, aber es würde automatisch jedem Code erlauben, eine modale Ansicht darzustellen, ohne ihnen vollen Zugriff auf einen Root-Controller-Pointer zu geben.

+0

Wow. Die Benachrichtigungsmethode ist großartig! Es räumt wirklich viel auf. Danke. –

+0

+1 Schöne Antwort, obwohl ich darauf hinweisen möchte, dass die Benachrichtigungszentrale für eine iPhone-App ein bisschen übertrieben ist, da die App nur wirklich auf sich selbst hört. [Schöne Beschreibung hier.] (Http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/) – opyate

0

Es ist nicht wie Sie die Zellen Navigationssteuerung überall gesetzt sieht, scheint es, dass es nicht mag [[self Navigation] PresentModalViewController: Controller animiert: YES]; diese Linie, überprüfen Sie die nagivationController Eigenschaft auf, dass „Selbst“ Objekt

Verwandte Themen