2

J'ai un UITableView et à l'intérieur que je crée une coutume UITableViewCell de la manière follwoing:Appeler une fenêtre modale à partir d'une mesure UITableViewCell

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

Je le fais pour peut obtenir touchesBegan et les événements touchesEnded (pour que je peut mettre en œuvre un long contact). En utilisant NSLog je peux voir que le longTouch est appelé correctement à partir de la méthode touchesBegan en utilisant le code suivant:

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

Le problème est que je ne suis pas en mesure d'appeler une fenêtre modale à partir de la méthode longTouch.

J'ai essayé ce qui suit, mais j'obtiens une exception NSInvalidArgumentException - [ItemCellController navigationController]: sélecteur non reconnu envoyé à une erreur d'instance. Donc, la question est, comment puis-je appeler une fenêtre modale à partir d'un UITableViewCell personnalisé.

Merci

Répondre

13

La navigationController propriété existe pour UIViewController s, mais UITableViewCell (que je suppose que ItemCellController est une sous-classe) n'est pas un UIViewController, il ne dispose pas de cette propriété par défaut.

Il y a quelques appraoches:

(1) Ajouter un bien UIViewController* (appelez peut-être controller) à votre type de cellule personnalisée, et passez un pointeur vers votre contrôleur avec votre méthode init (par exemple, initWithController:) . Ensuite, dans votre cellule, vous pouvez simplement exécuter:

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

(2) Votre objet délégué app pourrait avoir une propriété de contrôleur que vous pouvez accéder à partir de n'importe où dans votre code. Alors vous pourriez faire quelque chose comme ceci:

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

(3) Celui-ci est moins direct mais plus flexible. Vous pouvez configurer votre contrôleur racine (celui que vous souhaitez utiliser pour la présentation de la vue modale) pour écouter une notification spécifique et publier cette notification dans les cellules de votre tableau.

Exemple de code écouter, appelé à partir de votre contrôleur racine:

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

code postal de l'échantillon, appelée à partir d'une cellule de table:

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

Et la méthode showModal: de votre contrôleur racine utiliserait le userInfo inclus dans le NSNotification pour savoir quel contrôleur de vue présenter modalement. C'est plus de travail, mais cela permettrait automatiquement à n'importe quel code de présenter une vue modale, sans leur donner un accès complet à un pointeur de contrôleur racine.

+0

Wow. La méthode de notification est géniale! Ça nettoie vraiment beaucoup les choses. Merci. –

+0

+1 Bonne réponse, même si je tiens à souligner que le Centre de Notification pour une application iPhone est un peu exagéré, puisque l'application ne s'écoute vraiment que d'elle-même. [Belle description ici.] (Http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/) – opyate

0

Il ne semble pas, il semble que vous définissez ne importe où le contrôleur de navigation cellules qui n'aime pas [[self NavigationController] presentModalViewController: contrôleur d'animation: OUI]; cette ligne, vérifiez la propriété nagivationController sur cette « auto » objet

Questions connexes