Question

J'ai écrit une application universelle pour iPhone et iPad qui fonctionne très bien dans le simulateur iPad sur Xcode, mais je voudrais maintenant tester la fonctionnalité iPhone. Il me semble impossible d'exécuter le simulateur iPhone avec ce code comme toujours par défaut à l'iPad?

Au lieu de cela, j'essayé de courir sur l'appareil et qu'il commence à courir, je reçois 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

Comme l'application est construit plutôt que d'utiliser programme de XIB, j'ai divisé les 2 logiques de l'appareil en utilisant les lignes suivantes dans la méthode main.m:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}

A partir de ce point-là, ils utilisent différents AppDelegates et j'ai vérifié mes têtes pour assurer la UISplitView est jamais utilisé ni importé par la logique de téléphone.

Comment puis-je éviter cette erreur et est-il une meilleure façon de diviser les chemins logiques universelles dans cette application créée par programmation?

Était-ce utile?

La solution

Cette erreur est déclenchée parce que vous ne l'avez pas faible liaison du cadre UIKit. Le cadre UIKit dans l'iPhone OS 3.2 a ajouté le UISplitViewController, et si vous établissez un lien dans votre application normalement assumeront ces symboles existent sur 3.0, où ils ne le font pas.

Pour faible liaison d'un cadre, trouvez votre cible d'application dans Xcode, inspecter, et passez à l'onglet Général. Au bas de cet onglet devrait être une liste de cadres, avec une colonne pour le type. Changer le type de UIKit de requis à faible et à reconstruire votre application. Cela devrait prendre soin des erreurs d'exécution.

Votre logique conditionnelle est saine, mais je tends à partager un délégué de l'application et faire la mise en page spécifique à l'interface plus bas de la ligne.

(Mise à jour: 12/21/2011) A partir de iOS 4.2, vous ne devriez plus besoin de cadres de liens faibles afin d'éviter des erreurs comme celle-ci. Comme Marco Arment décrit , si vous construisez avec iOS 4.2 ou version ultérieure et cible vers le bas pour iPhone OS 3.1+, les classes individuelles sont maintenant faibles liés et devraient avoir leur retour méthode +class nil si la classe n'existe pas sur la version en cours d'exécution du système d'exploitation.

Autres conseils

J'avais une erreur très similaire et il me rend dingue! :-) Recherche d'heures et ne pouvait pas le comprendre ...

Comme vous l'avez dit, tout allait bien lors de l'exécution dans le simulateur iPad mais en essayant de tester l'application sur l'iPhone avec l'iPhone OS 3.1.2, il serait même pas commencer, mais plantage avec le message d'erreur suivant:

  

mi_cmd_stack_list_frames pas suffisamment d'images dans la pile

En vérifiant presque toutes les lignes de code, je compris que l'allocation de 3,2 classes comme UIPopoverController ou UISplitViewController (déjà à l'intérieur fourchue de code spécifique à l'iPad) a été l'origine du problème.

Ainsi, au lieu de i.e..

  

infoPopover = [[UIPopoverController alloc] initWithContentViewController: infoNavController];

i écrirais

  

infoPopover = [[NSClassFromString (@ "UIPopoverController") alloc] initWithContentViewController: infoNavController];

et qui a résolu mon problème! (Peut être si Debugging dur si le message d'erreur vous donne aucune idée sur l'endroit où pourrait trouver le bug ...)

Xcode 8.3, iPad 2 (non rétine), Swift 3 code

Ce qui m'a aidé pour moi était:

  • restart Xcode
  • faire un 'produit -> Clean' Maj Commande K
  • reconstruire le projet
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top