2013-03-09 1 views
0

J'ai des choses commeOù définir toutes mes constantes/variables globales?

#define IS_IPHONE_5 (fabs((double)[ [ UIScreen mainScreen ] bounds ].size.height - (double)568) < DBL_EPSILON) 

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.test.com/"]]; 

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"xyz" accessGroup:nil]; 

que je dois définir dans tous mes fichiers tout le temps. Est-il possible de les définir dans un fichier et de les importer à chaque fois?

modifier

Donc, comme suggéré j'ai ajouté ceci dans mon délégué app

#import <UIKit/UIKit.h> 
@class AFHTTPClient; 
@class KeychainItemWrapper; 

@interface TestAppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 
@property (nonatomic, strong, readonly) AFHTTPClient *httpClient; 
@property (nonatomic, strong, readonly) KeychainItemWrapper *keychainItem; 
@end 

puis essayé de définir mon httpClient dans mon viewcontroller comme

httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.test.com/"]]; 

il me donne une erreur disant use of undeclared identifier 'httpClient'

+1

Jetez aussi un coup d'œil à YourApp-Prefix.pch, qui est un en-tête pour tous les fichiers source – Thorsten

+0

@Thorsten pouvez-vous s'il vous plaît expliquer un peu plus? Comment cela fonctionnerait-il? – Jonathan

+0

Voulez-vous avoir la même instance 'httpClient' dans tous les fichiers, ou une nouvelle instance différente pour chaque fichier? – Hejazi

Répondre

0

Il existe de nombreuses approches. Vous pouvez créer un fichier d'en-tête dédié. Vous pouvez mettre des catégories sur AFHTTPClient et KeychainItemWrapper.

Je voudrais probablement tout de ceux dans les méthodes sur mon AppDelegate. Vous n'avez pas à importer AFHTTPClient.h et KeychainItemWrapper.h dans AppDelegate.h pour ce faire. Vous pouvez juste en avant-déclarer les classes:

@class AFHTTPClient; 
@class KeychainItemWrapper; 

@interface AppDelegate : NSObject <UIApplicationDelegate> 

@property (nonatomic, readonly) BOOL isIPhone5; 
@property (nonatomic, strong, readonly) AFHTTPClient *httpClient; 
@property (nonatomic, strong, readonly) KeychainItemWrapper *keychainItem; 

... 

Ensuite, vous venez de comprendre AFHTTPClient.h et KeychainItemWrapper.h dans les fichiers qui ont réellement besoin d'utiliser ces objets. En comparaison, la comparaison avec DBL_EPSILON est inutile. Tout d'abord, sur iOS, CGFloat est un alias pour float, et non double. Vous convertissez inutilement à double. Deuxièmement, le height de l'écran est 568. Un simple précision float peut représenter exactement tous les entiers entre -16777216 et 16777216, y compris 568. Vous pouvez simplement tester l'égalité.

+0

ouais j'ai un peu pensé :) Je préfère opter pour la mise en page automatique. Merci pour le conseil cependant. et où dois-je mettre tous dans mon AppDelegate? Ne dois-je pas importer tous les en-têtes associés à ces fichiers dans le délégué? – Jonathan

+0

J'ai mis à jour ma réponse. –

+0

peut-être que je suis encore en train de faire quelque chose de mal, mais il me donne toujours l'erreur – Jonathan

0

Oui, vous créez un fichier avec constantes déclarées et importer à chaque fois :)

0

Je n'ai pas fait de fichier de constantes globales depuis des années ... il y a toujours une meilleure place, plus localisée pour de telles définitions. Pourtant, de telles fonctionnalités sont utiles - répondront, mais réfléchissez à la façon dont vous pourriez les déclarer plus près des implémentations qui en ont besoin.

  • Créer un fichier d'en-tête et un fichier source
  • proclamera fonctions C, ou une interface de classe ObjC qui a des méthodes de classe.
  • Définir les fonctions/méthodes
  • puis #import l'en-tête 'constantes globales' que si nécessaire (pas dans la PCH)

Exemple d'utilisation des fonctions C:

// MONApp_Constants.h 
// no #imports up here 

extern bool MONApp_Is_iPhone5(void); 

@class AFHTTPClient; 
extern AFHTTPClient * MONApp_HTTPClient(void); 

@class KeychainItemWrapper; 
extern KeychainItemWrapper * MONApp_KeychainItem(void); 

de Bien sûr, vous aurez besoin de trouver un bon endroit pour contenir une référence aux objets, si vous ne voulez qu'une seule instance. Dans ce cas, les fonctions ne doivent pas être globalement visibles.

0

Vous devez déclarer les variables globales dans un fichier appelé constants.h et l'importer dans d'autres fichiers si nécessaire.

Je suggère que vous ne pas le faire:

#define httpClient [[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.test.com/"]]]; 

La raison étant URL que vous essayez de demander peut varier. L'idée de #define est d'avoir des éléments qui sont constants. Même si vous demandez toujours à @ "https://www.test.com/", je ne vous recommande toujours pas de le faire.

Hope this helps ...

Questions connexes