2010-04-23 4 views
8

Je suis très familier avec l'écriture d'applications basées sur VB mais je suis nouveau dans Xcode (et Objective C). J'ai parcouru de nombreux didacticiels sur le Web et compris les bases et comment interagir avec Interface Builder etc Cependant, je suis vraiment aux prises avec quelques concepts de base du langage C et je serais reconnaissant pour toute aide que vous pouvez offrir. Voici mon problème ...Comment appeler une fonction à partir d'un autre fichier de classe

J'ai une application iphone simple qui a un contrôleur de vue (FirstViewController) et une sous-vue (SecondViewController) avec des fichiers d'en-tête et de classe associés.

Dans le FirstViewController.m ont une fonction définie

@implementation FirstViewController 

- (void) writeToServer:(const uint8_t *) buf { 
    [oStream write:buf maxLength:strlen((char*)buf)]; 
} 

Il n'a pas vraiment ce que la fonction est.

Je veux utiliser cette fonction dans mon SecondViewController, donc dans SecondViewController.m importer des FirstViewController.h

#import "SecondViewController.h" 
#import "FirstViewController.h" 

@implementation SecondViewController 

-(IBAction) SetButton: (id) sender { 
    NSString *s = [@"Fill:" stringByAppendingString: FillLevelValue.text]; 
    NSString *strToSend = [s stringByAppendingString: @":"]; 
    const uint8_t *str = (uint8_t *) [strToSend cStringUsingEncoding:NSASCIIStringEncoding]; 
    FillLevelValue.text = strToSend; 

    [FirstViewController writeToServer:str]; 
} 

Cette dernière ligne est où mon problème. XCode me dit que FirstViewController peut ne pas répondre à writeToServer. Et quand j'essaie d'exécuter l'application, il se bloque lorsque cette fonction est appelée.

Je suppose que je ne comprends pas complètement comment partager des fonctions et, plus important encore, la relation entre les classes.

Dans un monde idéal, je créerais une classe globale pour placer mes fonctions et les appeler au besoin.

Tout conseil reçu avec gratitude.

+0

Vous feriez mieux de délégué utilisation –

+0

J'ai jusqu'à voté urs espèrent récupérer dans ma réponse aussi –

Répondre

1

Vous devez écrire:

- (void) writeToServer:(const uint8_t *) buf; 

dans votre fichier FirstViewController.h. C'est un indice pour le compilateur que la fonction est disponible pour cette classe particulière. Votre code fonctionnerait toujours sans cela, car la fonction réelle est implémentée, mais vous obtenez l'avertissement car le compilateur ne vérifie pas le fichier .m pour les fonctions existantes lorsque vous incluez l'en-tête d'un autre fichier source.

31

Dans le deklaration de votre méthode:

- (void) writeToServer:(const uint8_t *) buf; 

Le - au début de la déclaration indique, qu'il est une méthode instantanée. Cela signifie que vous devez créer une instance de votre classe pour l'appeler. S'il y avait un +, la méthode serait une méthode de classe et vous pourriez l'appeler comme vous le faites dans votre code.

Exemple:

@interface MyClass 
{ } 
- (void) myInstanceMethod; 
+ (void) myClassMethod; 
@end 

Puis, dans une fonction:

[MyClass myClassMethod]; // This is ok 

//[MyClass myInstanceMethod]; // this doenst't work, you need an instance: 

MyClass *theInstance = [[MyClass alloc] init]; 
[theInstance myInstanceMethod]; 
0

si vous voulez appeler cette méthode comme cette méthode ne déclarer writeToServer comme méthode de classe (méthode statique en bref ...)

pour que vous avez déclarer et définir comme

+ (void) writeToServer:(const uint8_t *) buf; 

+ (void) writeToServer:(const uint8_t *) buf { 
    [oStream write:buf maxLength:strlen((char*)buf)]; 
} 

seule différence est + signe au lieu de -

  • signe indiquent que la méthode est la méthode de classe (statique) et - le signe est par exemple la méthode (non statique)

Deuxième option est une instance de creat FirstViewController et appeler la méthode existante

-à-dire

FirstViewController FirstViewControllerObj = [[FirstViewController alloc] init]; 
[FirstViewControllerObj writeToServer:str]; 
+0

Merci pour la réponses ih ave a essayé les deux méthodes maintenant, mais n'arrive pas à faire fonctionner l'un d'entre eux. Je continue d'obtenir les erreurs suivantes ci-dessous SummaryViewController SummaryViewControllerObj = [[SummaryViewController alloc] init]; erreur: L'objet de taille variable peut ne pas être initialisé Erreur : instance de la classe object-c 'SummaryViewController' affectée statiquement erreur: instance de la classe object-c 'SummaryViewController' allouée statiquement et inférieure [summaryViewControllerObj writeToServer: str]; avertissement: 'SummaryViewController' peut ne pas répondre à '-writeToServer:' erreur: impossible de convertir en type de pointeur –

2
  1. Dans votre fichier FirstViewController.h, vous devez déclarer writeToServer comme méthode de FirstViewController objet dans le @interface section

    @interface FirstViewController : UIViewController { 
    } 
    
    - (void) writeToServer:(NSString *) str; 
    
    @end 
    
  2. Deuxièmement, le message suivant que vous envoyez est invalide car FirstViewControllerwriteToServer n'est pas une méthode de classe et n'est valide que s'il est appelé à partir d'une instanciation de la classe FirstViewController.

    FirstViewController *firstViewCnt = [[FirstViewController alloc] init]; 
    [firstViewCnt writeToServer:str]; 
    [firstViewCnt release]; 
    

Ou quelque chose comme ça.

4

Dans la ligne:

[FirstViewController writeToServer:str]; 

... vous envoyez le message writeToServer: à la FirstViewControllerclasse. Au lieu de cela, vous devez l'envoyer à un objet. Cela signifie que vous devez obtenir une référence à un objet FirstViewController puis envoyer l'objet le message writeToServer::

[firstViewControllerObject writeToServer:str]; 

Cependant, parce qu'il n'y a qu'une seule vue active à la fois sur l'iPhone, vous ne devriez pas avoir des objets FirstViewController et SecondViewController existant en même temps et communiquant entre eux. Au lieu de cela, vous devez créer des classes indépendantes pour exécuter la classe requise et le contrôleur de vue actif doit interagir avec ces classes.

Remarque: « Vous envoyez le message sayHello: à l'objet myObject » est juste une autre façon de dire la méthode « est comme l'orienté objet « que vous appelez la méthode writeToServer: de l'objet myObject (A. » version d'une fonction.)

Je recommande la lecture des Learning Objective-C et Learn Cocoa II tutoriels sur Cocoa Dev Central pour en savoir plus sur Cocoa/Objective-C et object-oriented programming.

0

FirstViewController.h

@interface FirstViewController: UIViewController 
- (void)GetItNow; 

FirstViewController.m

- (void)GetItNow{ 
    NSLog(@"I acheived"); } 

    - (IBAction)goToSecondView:(id)sender { 

    SecondViewController* Second= [[SecondViewControlleralloc] initWithNibName:@"SecondViewController" bundle:nil]; 
    rqVC.addId = self.addId; 
    [self.view addSubview:Second.view]; 

} 

SecondViewController.h

@property (nonatomic, assign) id delegate; 

SecondViewController.m

- (IBAction)Action_LoadFunds:(id)sender { 
    [self.view removeFromSuperview]; 
    [_delegate GetItNow]; 

} 
Questions connexes