2010-07-20 6 views
1

Il existe BEAUCOUP de questions liées à l'iphone de ce type. Je connais; Je les lis jusqu'à ce que je n'apprenne rien de nouveau, le tout dans le but d'éviter (a) de poster et (b) de regarder le vert puissant.sélecteur non reconnu AGAIN

@interface CommonCostingClass : NSObject { 

} 

-(void) theCCC; 

@end 

C'est tout. Aussi minime que je pouvais le faire. J'ai même eu recours à UIView au lieu de NSObject. A l'intérieur CommonCostingClass.m Je

#import "CommonCostingClass.h" 

@implementation CommonCostingClass 

-(void) theCCC { 
    // blah-blah 
} 

Encore une fois, c'est tout cela. Inside myViewController I codé

#import "CommonCostingClass.h" 

- (BOOL) textFieldShouldReturn:(UITextField *)textField { 
    if (textField.tag == 4) { 
     [(CommonCostingClass *) self.view theCCC]; // <-ka-boom 
    } 
    // other stuff 
} 

La présence/absence de la coulée ne fait aucune différence.

self.view génère
* - [UIView theCCC]: sélecteur non reconnu envoyé à l'instance 0x5d3dd20 20/07/2010 11: 30: 54,732 Wind17 [3233: 207]
*
mettant fin à l'application en raison de uncaught exception 'NSInvalidArgumentException', raison: '*** - [UIView theCCC]: sélecteur non reconnu envoyé à l'instance 0x5d3dd20'

génère le même message, avec la substitution de "myViewController" pour "UIView".

Nettoyer toutes les cibles n'a aucun effet.

Je sais que ni UIView ni myView Controller "voient" la méthode "the CCC".

Je ne sais pas comment dire: «C'est là, c'est là!

Merci pour votre aide. Un jour, cette situation sera drôle et pas embarrassante.

+0

CommonCostingClass est conçu pour être une vue personnalisée? – Vladimir

Répondre

1

On dirait que vous voulez vraiment

+(void) theCCC; 

(notez le « + ») qui est une méthode de classe, alors vous suffit d'appeler

[CommonCostingClass theCCC] 

Il n'y a vraiment pas de mystère « sélecteur non reconnu "Cela signifie que la première chose entre crochets (dans votre cas self.view) ne comprend pas (avoir la méthode) theCC. Et pourquoi le ferais-tu?

Vous avez déclaré un type de classe, mais pour utiliser cette classe, vous devez avoir une instance quelque part. Alors, comment pensez-vous qu'une instance de CommonCostingClass a été créée?

+0

Merci, Kendall. Je n'ai jamais utilisé "+" auparavant. Jamais besoin de. Tu as raison; c'est exactement ce dont j'ai besoin. En parlant de jamais, je parie que je n'oublierai plus jamais de créer une instance. –

+0

Si vous créez une instance et souhaitez que la méthode soit exécutée sur cette instance (avec ses variables d'instance par exemple), vous ne devez pas utiliser + méthode. C'est une méthode de classe et pas une méthode d'instance (-method) –

+0

J'ai pensé que vous pourriez vouloir juste quelques méthodes auxiliaires communes qui n'ont exigé aucune variable locale de classe pour faire le calcul; Si vous voulez cela, alors ce que vous voulez est soit un singleton, ou pour créer des instances des classes auxiliaires et les stocker dans votre contrôleur de vue. –

1

Au moins deux problèmes

  1. Si vous allez utiliser CommonCostingClass en vue, il a besoin de sous-classe UIView. Dans le code que vous publiez, CommonCostingClass est une sous-classe de NSObject. Cela pourrait être une faute de frappe ou cela pourrait indiquer un problème beaucoup plus fondamental avec ce que vous essayez de faire ici.
  2. Vous devez vous assurer que la propriété view de votre UIViewController est définie comme étant une instance de CommonCostingClass. La façon la plus simple de le faire est using Interface Builder.
+0

1. Non, CommonCostingClass n'est pas une vue. J'y effectue des calculs qui dépendent de variables utilisateur. Les variables sont capturées à partir de plusieurs vues. Donc, plusieurs contrôleurs de vue l'appellent. 2. L'application n'utilise pas IB. Jusqu'à présent, et à l'exception de cette question, cela fonctionne bien sans IB. 3. Merci pour la réponse rapide! Quatre minutes! –

+1

Donc, si CommonCostingClass n'est pas une vue, pourquoi vous attendez-vous à ce qu'elle soit retournée lorsque vous obtiendrez la propriété 'view' de votre contrôleur de vue? – kubi

+0

Je pense que vous avez plusieurs longueurs d'avance sur moi. Mon premier objectif, et pour l'instant seulement, est de comprendre le «sélecteur non reconnu». Juste ou faux, je me dis qu'après avoir fait ce petit pas, je peux passer à des questions plus importantes. En ce qui concerne la propriété view, je ne suis pas intéressé par la propriété view du contrôleur de vue. Je me débattais, c'est tout. J'essayais d'aborder ce qui semblait être le premier problème (potentiellement plusieurs): les problèmes de syntaxe et les lacunes dans mes connaissances. Si vous avez du code qui ne génère pas de "sélecteur non reconnu", mec, j'aimerais vraiment apprendre de lui. –

2

suivant les commentaires, sur cette ligne

[(CommonCostingClass *) self.view theCCC]; 

vous essayez d'effectuer la méthode -theCCC sur self.view. self.view est un UIView. Si vous voulez que votre classe personnalisée soit une sous-classe NSObject comme vous l'avez maintenant, vous devez créer et initialiser un objet CommonCostingClass dans votre contrôleur de vue, puis appeler -theCCC dessus.

modifier pour un sélecteur non reconnu: un sélecteur non reconnu signifie que vous appelez une méthode sur une classe qui n'implémente pas cette méthode. Dans votre cas, vous appelez theCCC sur UIView qui n'implémente pas ou ne connaît pas de méthode theCCC.

+1

On pourrait aussi remarquer qu'écrire simplement '(CommonCostingClass *)' avant 'self.view' ne change pas automatiquement La classe 'self.view', qui est une idée fausse semi-commune très tôt. – andyvn22

Questions connexes