2010-11-03 24 views
3

J'écris une application universelle qui fonctionnera nativement sur iPad et iPhone. J'ai également besoin qu'il soit ciblé sur les périphériques plus anciens (ceux qui ne peuvent pas fonctionner sous 4.0), donc 3.1 est un must.Application universelle (iPad + iPhone) destinée aux appareils plus anciens (iOS <4) - adopte un protocole sous conditions?

J'ai déjà configuré le SDK de base avec la dernière version disponible (4.2) et la cible de déploiement vers la version 3.1. Je fais beaucoup de contrôles d'exécution afin d'appeler les méthodes correspondantes uniquement sur le bon périphérique/version. Une des choses que j'utilise dans l'iPad est un UISplitViewController. Lors de l'assignation du délégué splitViewController, le compilateur lance un avertissement parce que l'interface de classe n'adopte pas explicitement le protocole UISplitViewControllerDelegate et j'ai peur que si je le déclare, l'application plante sur les périphériques plus anciens où il n'y a pas UISplitViewController/UISplitViewControllerDelegate.

Quelle est la meilleure façon de supprimer l'avertissement du compilateur? Devrais-je déclarer un UISplitViewControllerDelegate 'vide'? Si oui, puis-je le faire conditionnellement à l'exécution? Ou devrais-je simplement faire en sorte que l'interface de classe correspondante soit conforme au protocole et ne pas m'inquiéter des appareils plus anciens?

Best,

Répondre

1

Vous pouvez supprimer l'avertissement avec un casting simple C:

foo.delegate = (id<UISplitViewControllerDelegate>)self; 
0

Même problème si vous souhaitez utiliser l'impression et l'application ont Stil runnig avant 4.2. Fondamentalement cela fonctionne avec cela

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40200 
// code for iOS 4.2++ 
@interface PersonDetailViewController : UITableViewController <EditViewControllerDelegate, EditPickerViewControllerDelegate, UITextFieldDelegate, UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIPrintInteractionControllerDelegate>{ 
#else 
// code for iOS til 4.1 
@interface PersonDetailViewController : UITableViewController <EditViewControllerDelegate, EditPickerViewControllerDelegate, UITextFieldDelegate, UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>{ 
#endif 

Mais ... Il semble que InterfaceBuilder ne peut pas gérer cela. Toutes les sorties définissent après cette définition conditionnelle ar allé dans IB.

Donc, une meilleure solution?

Cordialement Gerd

1

Je ne l'ai pas essayé, mais je suis sûr que vous pouvez simplement aller de l'avant et d'adopter le protocole sans condition, même si la classe peut être utilisée sur une exécution plus ancien qui ne pas le protocole. Et voici pourquoi:

Toutes les informations pour définir un protocole sont contenues dans le fichier .h qui déclare le @protocol. Lorsque vous adoptez un protocole, cette déclaration de protocole est importée à un moment donné dans votre fichier .h (vraisemblablement par #import <UIKit/UIKit.h>). Lorsque le runtime a besoin de savoir quelque chose sur un protocole, il fait référence à un "objet de protocole", que vous référenceriez normalement dans le code source en faisant @protocol(MyProtocolName). Et le compilateur crée cet objet de protocole (au moment de la compilation) lorsqu'une telle référence de protocole est rencontrée, selon la section intitulée Protocol Objects dans La documentation Objective-C Programming Language. Donc, sachant tout cela, si vous adoptez un protocole et que vous écrivez un code qui fait référence à l'objet de protocole, cet objet de protocole sera créé par le compilateur. Même si vous utilisez un périphérique plus ancien, le compilateur devrait avoir créé cet objet de protocole pour vous, donc je ne pense pas que cela causerait un plantage.

Espérons que cela a du sens. Si j'ai un peu de temps, je peux essayer de voir si cela fonctionne en pratique parce que j'ai des appareils qui exécutent une gamme de versions iOS de 3.1 à 4.2.