2012-07-13 7 views
8

Sono nuovo per iOS e obective-c quindi non sono sicuro di come eseguire al meglio questo compito apparentemente semplice.iOS - come faccio a creare una classe "utility" che tutti i miei controller possono chiamare

Quello che voglio è quello di fare una classe che assomiglia a questo in pseudocodice:

class UtilityClass 
{ 
    // Have a method that I can pass parameters to 
    String doCalculation (String art1 , String arg2) 
    { 
     return arg1 + arg2; 
    } 
} 

La mia incertezza è:

1) xCode sembra essere incline a posare la mia struttura di file in un tempo relativamente modo piatto. Quindi dovrei creare una directory utils e avere questo file sotto utils/fileName? Di solito sono abituato ad avere almeno qualche directory src, ma finora non mi è stato richiesto nulla per crearne uno. 2) Come posso importare e chiamare questa classe/funzione dai miei controller?

Grazie, Alex

+0

In alcuni casi, è opportuno utilizzare un pattern Singleton: http://db-in.com/blog/2011/12/objective-c-singleton/ – Floydian

risposta

15

Basta creare un nuovo gruppo chiamato Utilities, e quindi creare la classe al suo interno. Mi piace,

utils.h 
utils.m 

Più tardi nel file di intestazione del ViewController basta aggiungere.

#import "utils.h" 

se questo utils classe viene utilizzata da molti controllori in progetto molto grasso, allora, trovare un file chiamato, devono essere all'interno di supporto di gruppo dei file.

YourAppName-Prefix.pch 

In quel file si dispone di un blocco di codice come questo,

#ifdef __OBJC__ 
    #import <UIKit/UIKit.h> 
    #import <Foundation/Foundation.h> 
    #import <CoreData/CoreData.h> 
#endif 

Basta modificare questo blocco e aggiungere il vostro riferimento utils.h qui, in questo modo l'intero progetto può creare utils oggetto senza importare esplicitamente in la propria intestazione.

Modifica come questo.,

#ifdef __OBJC__ 
    #import <UIKit/UIKit.h> 
    #import <Foundation/Foundation.h> 
    #import <CoreData/CoreData.h> 
    #import "utils.h" 
#endif 
+0

grazie, qual è la pratica comune? Per creare il nuovo gruppo sotto qualcosa come forse root_dir/src/utils? Ho posizionato i miei controller nella directory root che sembrava funky da sempre ... qual è un buon modo per disporre le strutture delle directory qui? – GeekedOut

+0

Dipende tutto da te, è molto flessibile puoi creare un gruppo in qualsiasi modo tu voglia. Perché mentre importi i file non includi comunque il nome di quel gruppo. Ma ti consiglio di standardizzare il tuo modo di farlo e di persistere per i tuoi prossimi progetti. – doNotCheckMyBlog

4

Dove si memorizzano i file dipende da voi, basta assicurarsi XCode sa dove trovarli. La classe stessa dovrebbe essere fatto come qualsiasi altra classe Objective C, appena lo rendono ereditare da NSObject al posto di una delle classi grafiche:

// MyClass.h 
@interface MyClass : NSObject { 
    int instanceVar; 
} 
@property (nonatomic, assign) int property; 
@end 

// MyClass.m 
#import "MyClass.h" 
@implementation MyClass 
@synthesize property; 
-(id) init { 
    ... 
} 
-(int) function { 
    ... 
} 
@end 

per utilizzare la classe in un altro file, basta importare l'intestazione come qualsiasi altra classe

#import "MyClass.h" 
7

Prima di tutto creare un nuovo file in Xcode e deselezionare di file XI ter. Assegna un nome al progetto come preferisci. ed estendilo da NSObject.

per la creazione di metodo statico si deve sostituire la funzione di partenza - a + come l'interfaccia

. classe

@interface Utility : NSObject 
+ (int)getNumber; 
+ (void)setNumber:(int)number; 
@end 

.m classe

#import "Utility.h" 

@implementation Utility 

static int number = 1; 

+ (int)getNumber { 
    return number; 
} 

+ (void)setNumber:(int)newNumber { 
    number = newNumber; 
} 

+ (id)alloc { 
    [NSException raise:@"Cannot be instantiated!" format:@"Static class 'ClassName' cannot be instantiated!"]; 
    return nil; 
} 

@end 

chiamata in altro ViewController come

NSLog(@"number = %d", [Utility getNumber]); 
    [Utility setNumber:3]; 
    NSLog(@"number = %d", [Utility getNumber]); 

for details..

Problemi correlati