2010-04-23 30 views
8

Ho molta familiarità con la scrittura di applicazioni basate su VB ma sono nuovo su Xcode (e Objective C). Ho seguito numerosi tutorial sul web e ho compreso le basi e il modo di interagire con Interface Builder ecc. Tuttavia, sto davvero lottando con alcuni concetti di base del linguaggio C e sarei grato per qualsiasi aiuto tu possa offrire. Ecco il mio problema ...Come chiamare una funzione da un altro file di classe

Ho una semplice app per iphone che ha un controller di visualizzazione (FirstViewController) e una sottoview (SecondViewController) con i file di intestazione e classe associati.

Nel FirstViewController.m hanno una funzione definita

@implementation FirstViewController 

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

Essa in realtà non importa quale sia la funzione.

voglio usare questa funzione nel mio SecondViewController, quindi in SecondViewController.m importare 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]; 
} 

Questa ultima riga è dove il mio problema. XCode indica che FirstViewController potrebbe non rispondere a writeToServer. E quando provo a eseguire l'applicazione si blocca quando viene chiamata questa funzione.

Immagino di non capire appieno come condividere le funzioni e, ancora più importante, la relazione tra le classi.

In un mondo ideale creerei una classe globale per inserire le mie funzioni e chiamarle come richiesto.

Qualsiasi consiglio ricevuto con gratitudine.

+0

È un uso migliore delegato –

+0

ho fino votato Urs sperano di farlo tornare nella mia risposta anche –

risposta

1

è necessario scrivere:

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

nel file FirstViewController.h. Questo è un suggerimento per il compilatore che la funzione è disponibile per quella particolare classe. Il tuo codice funzionerebbe ancora senza questo, perché la funzione effettiva è implementata, ma ottieni l'avviso perché il compilatore non controlla il file .m per le funzioni esistenti quando includi l'intestazione da un altro file sorgente.

31

Nel Deklaration del metodo:

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

L'- all'inizio della dichiarazione indica, che si tratta di un metodo immediato. Ciò significa che devi creare un'istanza della classe per chiamarla. Se ci fosse un +, il metodo sarebbe un metodo di classe e puoi chiamarlo nel modo in cui lo fai nel tuo codice.

Esempio:

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

Poi in qualche funzione:

[MyClass myClassMethod]; // This is ok 

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

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

se si desidera chiamare questo metodo come questo unico metodo dichiarare writeToServer come metodo di classe (metodo statico a breve ...)

per che avete dichiarare e definirlo come

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

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

unica differenza è + segno invece di -

  • segno indicano che il metodo è il metodo di classe (statico) e - il segno è per esempio il metodo (non statico)

Seconda opzione è esempio creat di FirstViewController e chiamare il metodo esistente

cioè

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

Grazie per il risponde ih Ho provato entrambi i metodi ora, ma non riesco a far funzionare nessuno di questi continui a ricevere i seguenti errori sotto SummaryViewController SummaryViewControllerObj = [[SummaryViewController alloc] init]; errore: L'oggetto a dimensione variabile non può essere inizializzato Errore : istanza allocata staticamente di classe oggetto-c 'SummaryViewController' errore: istanza allocata staticamente della classe object-c 'SummaryViewController' e sotto [summaryViewControllerObj writeToServer: str]; Avviso : 'SummaryViewController' potrebbe non rispondere a '-writeToServer:' errore: impossibile convertire in tipo puntatore –

2
  1. Nel file FirstViewController.h, è necessario dichiarare writeToServer come metodo di FirstViewController oggetto nel @interface sezione

    @interface FirstViewController : UIViewController { 
    } 
    
    - (void) writeToServer:(NSString *) str; 
    
    @end 
    
  2. In secondo luogo, il seguente messaggio inviato non è valido poiché FirstViewControllerwriteToServer non è un metodo di classe ed è valido solo se chiamato da un'istanza della classe FirstViewController.

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

O qualcosa del genere.

4

Nella linea:

[FirstViewController writeToServer:str]; 

... si sta inviando il messaggio writeToServer: alla FirstViewControllerdi classe. Invece, è necessario inviarlo a un oggetto FirstViewController. Ciò significa che è necessario per ottenere un riferimento a un oggetto FirstViewController e poi inviare l'oggetto il writeToServer: messaggio:

[firstViewControllerObject writeToServer:str]; 

Tuttavia, poiché v'è un solo vista attiva alla volta su iPhone, non si dovrebbe avere FirstViewController e SecondViewController oggetti esistenti allo stesso tempo e comunicanti tra loro. Invece, dovresti creare classi indipendenti per eseguire la classe richiesta e il controller di visualizzazione attivo dovrebbe interagire con queste classi.

Nota: "Stai inviando il messaggio sayHello: all'oggetto myObject" è solo un altro modo di dire il metodo 'è come l'object-oriented "si sta chiamando il metodo dell'oggetto myObjectwriteToServer: (A.' versione di una funzione.)

mi raccomando di leggere le Learning Objective-C e Learn Cocoa II tutorial su Cocoa Dev Central per saperne di più su Cocoa/Objective-C e 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]; 

} 
Problemi correlati