Malgré l' erreur « Classe inconnue MyClass dans le fichier Interface Builder » imprimée au moment de l'exécution, ce problème n'a rien à voir avec Interface Builder, mais plutôt avec l'éditeur de liens, qui ne lie pas une classe car aucun code ne l'utilise directement.
Lorsque les données .nib (compilées à partir du .xib) sont chargées au moment de l'exécution, elles MyClass
sont référencées à l'aide d'une chaîne, mais l'éditeur de liens n'analyse pas la fonctionnalité du code, juste l'existence du code, donc il ne le sait pas. Puisqu'aucun autre fichier source ne fait référence à cette classe, l'éditeur de liens optimise sa disparition lors de la création de l'exécutable. Ainsi, lorsque le code d'Apple tente de charger une telle classe, il ne peut pas trouver le code qui lui est associé et affiche l'avertissement.
Par défaut, les cibles Objective-C auront des -all_load -ObjC
drapeaux définis par défaut, qui conserveront tous les symboles. Mais j'avais commencé avec une cible C ++, et je n'avais pas ça. Néanmoins, j'ai trouvé un moyen de contourner ce problème, ce qui maintient l'éditeur de liens agressif.
Le hack que j'utilisais à l'origine était d'ajouter une routine statique vide comme:
+(void)_keepAtLinkTime;
qui ne fait rien, mais que j'appellerais une fois, comme:
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
Cela forcerait l'éditeur de liens à conserver la classe entière, et l'erreur disparaît.
Comme jlstrecker l'a souligné dans les commentaires, nous n'avons pas vraiment besoin d'ajouter une _keepAtLinkTime
méthode. Il suffit d'appeler un téléphone existant, tel que:
[MyClass class];
fait l'affaire (tant que vous dérivez d'un NSObject
).
Bien sûr, vous pouvez l'appeler à n'importe quel endroit de votre code. Je suppose que cela pourrait même être en code inaccessible. L'idée est de tromper l'éditeur de liens en pensant qu'il MyClass
est utilisé quelque part afin qu'il ne soit pas si agressif pour l'optimiser.
Xcode 6.3.2 et Swift 1.2
Définition rapide de la vue. Assurez-vous de passer outre init(coder aDecoder: NSCoder)
. Définition Objective-C du contrôleur de vue. Et, une plume dans un poirier.
Ajoutez le nom du module à l'inspecteur de détails Nib où vous choisissez votre classe.