Universelle iPhone/iPad de l'application de débogage erreur de compilation pour iPhone tests
J'ai écrit une application iPhone et iPad app universelle qui fonctionne très bien sur l'iPad simulateur sur Xcode, mais maintenant, j'aimerais tester les fonctionnalités de l'iPhone. Je ne semble pas en mesure d'exécuter le simulateur d'iPhone, avec ce code, comme il le fait toujours défaut à l'iPad?
Au lieu de cela j'ai essayé de courir sur l'appareil et qu'il commence à courir, j'obtiens l'erreur suivante:
dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST
Que l'Application est développée par programme plutôt que d'utiliser XIB, j'ai divisé les 2 périphériques logiques en utilisant les lignes suivantes dans la main.m méthode:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}
À partir de ce moment-là, ils utilisent différents AppDelegates et j'ai vérifié mes en-têtes pour assurer la UISplitView n'est jamais utilisé ni importé via le Téléphone de la logique.
Comment puis-je éviter cette erreur, et est-il une meilleure façon de diviser l'universel logique, des chemins par programme-créé app?
- Vous avez fait droit à l'exception directe de vérifier si (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) vérifier ce lien pour nice méthode utilitaire cocoabugs.blogspot.com/2010/09/...
- Et comment trouver des références à de nouvelles Api qui n'existait pas avant 4? Grande réponse de here
Vous devez vous connecter pour publier un commentaire.
Que l'erreur est déclenché parce que vous n'avez pas maillons faibles du framework UIKit. Le framework UIKit de l'iPhone OS 3.2 ajouté le UISplitViewController, et si vous avez un lien en tant normal de votre application bénéficiera de ces symboles existent sur 3.0, où ils ne sont pas.
À maillons faibles d'un cadre, de trouver votre application cible dans Xcode, l'inspecter, et aller à l'onglet Général. Au bas de cet onglet doit être une liste de cadres, avec une colonne de Type. Modifier le Type de UIKit de Tenu de la Faiblesse et de la reconstruction de votre application. Qui devrait prendre en charge les erreurs d'exécution.
Votre logique conditionnelle est bonne, mais j'ai tendance à partager une application de déléguer et de faire l'interface spécifique à la mise en page plus loin sur la ligne.
(Mise à jour: 12/21/2011) Comme de l'iOS 4.2, vous n'avez plus besoin de le maillon faible de cadres afin d'éviter des erreurs de ce genre. Comme Marco Arment décrit, si vous construisez avec iOS 4.2 ou version ultérieure et de la cible vers le bas de l'iPhone OS 3.1+, les cours individuels sont maintenant faibles liés et doivent avoir leur
+class
de retour de méthodenil
si la classe n'existe pas sur le cours d'exécution de la version de l'OS.NSClassFromString()
J'ai eu un très semblables, d'erreur et il a été me rend fou! 🙂 La recherche pendant des heures et ne pouvait pas le comprendre...
Comme vous l'avez dit, tout s'était bien passé lors de l'exécution dans le Simulateur d'iPad mais lorsque j'essaie de tester l'Appli sur l'iPhone avec l'iPhone OS 3.1.2 il ne serait même pas le début, mais d'un plantage avec le message d'erreur suivant:
En cochant presque chaque ligne de code que j'ai réalisé que l'allocation de 3.2 classes comme UIPopoverController ou UISplitViewController (déjà à l'intérieur de fourche iPad-code spécifique) a été à l'origine du problème.
Donc au lieu de dire:
je voudrais écrire
et qui a résolu mon problème! (Débogage peut être si difficile si le message d'erreur ne vous donne aucun indice sur l'endroit où le bug pourrait éventuellement être trouvé...)
Xcode 8.3, iPad 2 (non retina), Swift 3 code
Ce qui a aidé pour moi a été: