Accesso al metodo da altre classi Obiettivo-C

Ho cercato una risposta a questa domanda, ma non ne ho ancora trovato uno adatto. Spero che voi ragazzi (e ragazze) potete aiutarmi! (Questo è per un’app per iPhone)

Bene, ho un’applicazione Mutliview. Ogni vista ha la sua class e tutto è felice. Tuttavia, le diverse classi a volte chiamano lo stesso metodo. Fino ad ora, ho semplicemente scritto quel Metodo due volte, in entrambi i file di class.

Questo è quello che voglio fare però:

Voglio fare una nuova class, nel suo proprio file, che ha tutti i metodi “comuni”. Quindi, ogni volta che un’altra class ha bisogno di chiamare il metodo, lo chiamo semplicemente dall’altro file. In questo modo, quando voglio cambiare il metodo, ho solo bisogno di cambiarlo in un posto, e non tutti i posti …

Non sono sicuro di come lo farei, motivo per cui chiedo aiuto. Sono un po ‘arrugginito e nuovo per Objective-C, quindi molti esempi mi aiuteranno molto. Permettimi di dartene uno.

File: ViewController1.m

@implementation ViewController1 //Do Some awesome stuff.... CALL "CommonMethod" HERE @end 

File: ViewController2.m

 @implementation ViewController2 //Do Some awesome stuff.... CALL "CommonMethod" HERE @end 

File: CommonClass

 @implementation commonClass - (void)CommonMethod:(id)sender { //So some awesome generic stuff... } @end 

Mi sento come se avessi bisogno di # importare l’altro file, creare un object dalla class e chiamare il metodo dall’object … Come faccio?

Grazie ancora!

Opzione 1:

 @implementation commonClass + (void)CommonMethod:(id)sender /* note the + sign */ { //So some awesome generic stuff... } @end @implementation ViewController2 - (void)do_something... { [commonClass CommonMethod]; } @end 

Opzione 2:

 @implementation commonClass - (void)CommonMethod:(id)sender { //So some awesome generic stuff... } @end @implementation ViewController2 - (void)do_something... { commonClass *c=[[commonClass alloc] init]; [c CommonMethod]; [c release]; } @end 

Opzione 3: usa l’ereditarietà (vedi la descrizione di Mr. Totland in questa discussione)

 @implementation commonClass - (void)CommonMethod:(id)sender { //So some awesome generic stuff... } @end /* in your .h file */ @interface ViewController2: commonClass @end 

naturalmente hai sempre bisogno di #import commonClass.h nei tuoi controller di visualizzazione ..

Ci sono alcune risposte qui che ti dicono di creare una class “genitore” comune. Comunque penso che tu possa fare molto meglio. Crea invece una categoria per UIViewController. Non si conoscono tutti i componenti interni di ciò che accade con UIViewController, quindi non penso che valga la pena creare la propria gerarchia di View Controller al di fuori di. In effetti potrebbe essere pericoloso. Ho incontrato una serie di problemi quando ho cercato di creare un UITableViewController “di base” e quindi creare classi che ereditassero da quello. Ho evitato questi problemi utilizzando invece le categorie.

La tua priorità numero 1 non dovrebbe ereditare le cose senza una buona ragione, dovrebbe essere trovare un’app nell’app store che le persone vorranno scaricare.

Mi sembra che il codice comune non abbia bisogno di essere in una class. C’è una ragione per cui non puoi semplicemente usare una funzione in stile C per quello che vuoi fare?

Puoi inserire il codice comune in una class e quindi creare le sottoclassi delle altre due classi di quella class; questo metodo evita anche la duplicazione del codice.

Un’altra opzione potrebbe essere quella di scrivere un metodo di class invece dei metodi di istanza per questo codice comune. Penso che molte persone ritengano che i singleton siano meglio evitati come scelta di design.

Sarebbe più facile dare una buona risposta se sapessimo di più su cosa stavi davvero cercando di realizzare.

Quello che vuoi fare è fare in modo che i due controller condividano una superclass comune:

 UIViewController : MyAwesomeViewController : ViewController1 : ViewController2 

commonMethod: risiederà quindi in MyAwesomeViewController. Inoltre, non iniziare i nomi dei metodi con lettere maiuscole. 🙂

Elaborare:

 [email protected] MyAwesomeController : UIViewController { [email protected] ViewController1 : UIViewController { // and ditto for ViewController2 [email protected] ViewController1 : MyAwesomeController { 

Ricorda che Objective-C è solo un superset di C, e che mentre #include le direttive sono usate principalmente per i file header, non c’è nulla che ti impedisca di usare # include per incorporare il contenuto di un’implementazione all’interno di un’altra implementazione. Se il codice è veramente identico, puoi semplicemente incollarlo nel suo file e # includerlo nel file .m.

Detto questo, forse sarebbe meglio usare questa tecnica insieme alle categorie, specialmente se la stessa implementazione ha comportamenti simili.

Passa un riferimento alla tua commonclass quando assegni e apri le tue visualizzazioni …

 CommonClass *cc = [[CommonClass alloc] init]; ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc]; ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc]; 

ma fare un classico c include potrebbe essere sufficiente.

Come un neofita di iPhone con uno sfondo Java e una piccola C, ho avuto un problema simile che volevo fare riferimento a un metodo sia in RootController che in un ViewController. Mi è sembrato che il metodo appropriato per il metodo fosse la class AppDelegate, un’istanza di cui si ottiene in altre classi:

 MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

quindi se il metodo è “doSomething” lo si accede da:

 [delegate doSomething]; 

Ma forse questo è troppo ovvio o meno ciò che è stato richiesto.

Un altro metodo che puoi usare

 @interface ServerManager : NSObject +(ServerManager *)getInstance; @implementation ServerManager +(ServerManager *)getInstance { static ServerManager *objServerManager = nil; if(objServerManager==NULL){ objServerManager=[[self alloc] init]; } // Return the servermanager object. return objServerManager; } 

Chiama se si desidera utilizzare

 ServerManager *SMObject = [ServerManager getInstance]; 

Non dimenticare di importare il file servermanager.h.