Malgré le " Classe inconnue MyClass dans le fichier Interface Builder. "Ce problème n'a rien à voir avec Interface Builder, mais plutôt avec le linker, qui ne lie pas une classe parce qu'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, MyClass
est référencé en utilisant une chaîne, mais l'éditeur de liens n'analyse pas la fonctionnalité du code, seulement son existence, donc il ne le sait pas. Comme aucun autre fichier source ne fait référence à cette classe, l'éditeur de liens l'optimise pour qu'elle n'existe pas lors de la création de l'exécutable. Ainsi, lorsque le code d'Apple essaie 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 -all_load -ObjC
activé par défaut, ce qui permet de conserver tous les symboles. Mais j'avais commencé avec une cible C++, et je n'avais pas cela. Néanmoins, j'ai trouvé un moyen de contourner ce problème, qui maintient l'agressivité de l'éditeur de liens.
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 le linker à garder la classe entière, et l'erreur disparaîtrait.
Comme jlstrecker l'a fait remarquer dans les commentaires, nous n'avons pas vraiment besoin d'ajouter un _keepAtLinkTime
méthode. Il suffit d'appeler une méthode existante, telle que :
[MyClass class];
fait l'affaire (à condition de dériver d'un fichier NSObject
).
Bien entendu, vous pouvez appeler cette fonction à n'importe quel endroit de votre code. Je suppose que cela pourrait même être dans du code inaccessible. L'idée est de tromper l'éditeur de liens en lui faisant croire que MyClass
est utilisé quelque part pour qu'il ne soit pas si agressif en l'optimisant.
Xcode 6.3.2 et Swift 1.2
Définition rapide de la vue. Assurez-vous de remplacer 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 des détails de la Nib où vous choisissez votre classe.
0 votes
Comment se connecter à la bibliothèque ?
0 votes
J'utilise un sous-projet dépendant, et j'ai fait un drag'n'drop depuis les produits du sous-projet Xcode dans la phase de construction "Link Binary With Library" de ma cible actuelle.
0 votes
Si la classe est issue de CocoaPods, ceci pourrait aider github.com/CocoaPods/CocoaPods/issues/491 .
0 votes
Cela pourrait être lié ? stackoverflow.com/a/24924967/511299