2012-03-16 9 views
7

Questa è una domanda molto semplice, ma ho cercato dappertutto e non sono riuscito a trovare una risposta che spiegasse abbastanza bene da permettermi di capirlo.Come chiamare il metodo da una classe in un'altra (iOS)

Quello che voglio fare è creare un metodo in una classe della mia app per iOS e quindi chiamare quel metodo da altre classi nella mia app. Qualcuno potrebbe spiegare esattamente cosa devo fare per raggiungere questo obiettivo? Qualsiasi aiuto sarebbe molto apprezzato visto che tutti i miei tentativi finora hanno fallito!

Grazie.

+2

Penso che la tua domanda è un po 'vago. Lo avrai già fatto in qualsiasi app di base. vale a dire. chiamare metodi su oggetti. Puoi dare esempi di codice che mostrano cosa stai cercando di fare? – drekka

+0

È possibile utilizzare NSNotificationCenter o Delegates o i protocolli personalizzati .... –

risposta

43

Objective-C:

Bisogna importare l'intestazione della classe che contiene il metodo che si desidera utilizzare (ClassYouWantToUse.h) nella classe che si desidera utilizzarlo in (TargetClass).

All'interno del TargetClass.h o TargetClass.m (a seconda del campo di applicazione che si vuole dare):

#import "ClassYouWantToUse.h" 

quindi creare un'istanza della classe che si desidera utilizzare all'interno della classe di destinazione sia come proprietà come questa:

@property (nonatomic,strong) ClassYouWantToUse *classObject; 

O come una variabile di istanza in questo modo:

ClassYouWantToUse *classObject; 

Assicurati di inizializzarlo! (Di solito all'interno viewDidLoad):

classObject = [[ClassYouWantToUse alloc] init]; 

Ora è possibile chiamare i metodi pubblici di quella classe in questo modo:

[classObject theClassMethodWithParam:param1 andSecondParam:param2]; 

Nota: La classe ClassYouWantToUse deve avere i metodi che si desidera rendere accessibili ad altri dichiarandoli nel file di intestazione:

- (void)theClassMethodWithParam:(UIImage*)someImage andSecondParam:(NSString*)someText; 

Altrimenti non sarete in grado di vedere questi metodi.


Swift:

Theres davvero niente di speciale su di esso in rapido, solo l'aggiunta di questo come un punto di riferimento.

In rapida è sufficiente creare un'istanza della classe che si desidera utilizzare:

let classObject = ClassYouWantToUse() 

e usarlo direttamente:

classObject.theClassMethodWithParam(param1, andSecondParam:param2) 
+0

Grazie ** so ** much! Non puoi immaginare quanti post ho letto cercando di capirlo. Funzionando proprio come volevo ora! –

+0

Luis Oscar, sei un bell'uomo! – Ian

+0

Curioso però qual è la soluzione corretta per avere ora due istanze di ClassToBeUsed? Perché * qualcosa non è la stessa di sé in ClassToBeUsed? Quindi, in questo esempio, se farei riferimento a se stessi da [qualcosa di simile a WithParam: blabla eSecondParam: otherbla] farebbe riferimento a * qualcosa. Cosa succede se ho bisogno di fare riferimento all'istanza originale di ClassToBeUsed? – rick

3

Sono disponibili due opzioni di base. È possibile creare o passare un'istanza della prima classe alla seconda classe, oppure è possibile aggiungere un metodo statico alla prima classe e chiamarlo direttamente utilizzando l'oggetto classe.

Per esempio, supponiamo di avere:

@interface ClassA : NSObject { 
} 

//instance methods 
- (int) addNumber:(int)num1 withNumber:(int)num2; 

//static/class methods 
+ (int) add:(int)num1 with:(int)num2; 
@end 

@implementation ClassA 
- (int) addNumber:(int)num1 withNumber:(int)num2 { 
    return num1 + num2; 
} 

+ (int) add:(int)num1 with:(int)num2 { 
    return num1 + num2; 
} 
@end 

allora si può fare:

#import "ClassA.h" 

@interface ClassB : NSObject { 
    ClassA* adder; 
} 

//constructors 
- (id) init; //creates a new instance of ClassA to use 
- (id) initWithAdder:(ClassA*)theAdder; //uses the provided instance of ClassA 

//instance methods 
- (int) add2To:(int)num; 

//static/class methods 
+ (int) add3To:(int)num; 
@end 

@implementation ClassB 
- (id) init { 
    if (self = [super init]) { 
     adder = [[ClassA alloc] init]; 
    } 
    return self; 
} 

- (id) initWithAdder:(ClassA*)theAdder { 
    if (self = [super init]) { 
     adder = theAdder; 
    } 
    return self; 
} 

- (int) add2To:(int)num { 
    return [adder addNumber:2 withNumber:num]; 
} 

+ (int) add3To:(int)num { 
    return [ClassA add:3 with:num]; 
} 
@end 

Nota che nella maggior parte dei casi, è necessario utilizzare metodi di istanza, piuttosto che metodi statici.

Problemi correlati