32 votes

Pouvez-vous accéder au délégué d'application depuis une fonction UITableViewDataSource?

Je suis à essayer de comprendre l'SQLite fonctionnalités pour l'iPhone, et je vais avoir quelques problèmes à la lecture de mon fichier de base de données à partir d'un substituée UITableViewDataSource fonction. Je suis le stockage de la base de données de l'emplacement du fichier dans un ivar (comme un NSString) dans mon application délégué, cependant lorsque j'essaie d'accéder à cette chaîne à partir d'un substituée UITableViewDataSource fonction, il renvoie à un autre objet. Si je accéder à la chaîne à partir de l'une des classes propres méthodes d'instance, il fonctionne très bien.

Est-il possible d'accéder à l'application délégué de l'intérieur substituée UITableViewDataSource fonctions?

75voto

Roger Nolan Points 10248

L'application est un singleton qui conserve une référence au délégué de l'application. Vous pouvez toujours accéder à votre délégué d'application à l'aide de:

 [UIApplication sharedApplication].delegate
 

Vous devrez peut-être convertir le retour dans votre propre classe de délégué d'application pour vous débarrasser des avertissements. Mieux encore, écrivez un accesseur qui renvoie le délégué de votre application upcast:

 #pragma mark access to app delegate etc.
+ (MyAppDelegateClass*) sharedAppDelegate; {
    return (MyAppDelegateClass*)[[UIApplication sharedApplication] delegate];
}
 

22voto

mmc Points 12051

Roger a raison, mais je trouve personnellement extrêmement déroutant de mélanger la syntaxe à points et la syntaxe entre crochets dans la même instruction.

Si cela vous confond également, la syntaxe équivalente, en utilisant uniquement la notation entre crochets, est la suivante:

 [[UIApplication sharedApplication] delegate];
 

et oui, vous devrez peut-être transtyper le résultat pour qu'il soit votre classe de délégué d'application, plutôt que la classe générique UIApplicationDelegate, ou vous obtiendrez probablement un certain nombre d'avertissements du compilateur.

8voto

Justin Searls Points 3078

Bien que je n'aime pas trop coller à mon AppDelegate, il me faudra souvent y accéder pour accéder aux autres singletons de mon application, ce qui rend la méthode call + cast un peu lourde. Donc, dans la plupart de mes applications, je définirai une macro rapide dans mon fichier d'en-tête global.

Exemple suit:

 
#define MY_DELEGATE (AppDelegate*)[[UIApplication sharedApplication] delegate]
 

Il est beaucoup plus facile de se référer à MY_DELEGATE .

1voto

jammur Points 589

Le problème s'est avéré être vraiment simple. J'avais créé NSString pour contenir le chemin d'accès à mon fichier de base de données à l'aide de stringByAppendingPathComponent:. Je n'avais pas réalisé que cela allait être automatiquement publié, et je n'ai donc pas pris la peine de le conserver explicitement. La raison pour laquelle il renvoyait un type d'objet différent était parce que la mémoire avait été réutilisée une fois la chaîne libérée automatiquement.

Conserver explicitement la chaîne contenant le chemin d'accès au fichier de base de données a résolu le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X