webentwicklung-frage-antwort-db.com.de

Kompilierungsfehler beim Debuggen von iPhone/iPad-Anwendungen für iPhone-Tests

Ich habe eine universelle iPhone- und iPad-App geschrieben, die im iPad-Simulator auf Xcode einwandfrei funktioniert, möchte aber jetzt die iPhone-Funktionalität testen. Ich kann den iPhone-Simulator anscheinend nicht mit diesem Code ausführen, da er standardmäßig auf dem iPad ausgeführt wird.

Stattdessen habe ich versucht, auf dem Gerät zu laufen, und als es zu laufen beginnt, erhalte ich die folgende Fehlermeldung:

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

Da die App programmgesteuert erstellt wird, anstatt XIBs zu verwenden, habe ich die beiden Gerätelogiken mithilfe der folgenden Zeilen in der main.m-Methode aufgeteilt:

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

Ab diesem Zeitpunkt verwenden sie unterschiedliche AppDelegates und ich habe meine Header überprüft, um sicherzustellen, dass UISplitView niemals über die Telefonlogik verwendet oder importiert wird.

Wie vermeide ich diesen Fehler und gibt es eine bessere Möglichkeit, die universellen Logikpfade in dieser programmgesteuert erstellten App zu teilen?

30
andybee

Dieser Fehler wird ausgelöst, weil Sie das UIKit-Framework nicht schwach verknüpft haben. Das UIKit-Framework in iPhone OS 3.2 hat den UISplitViewController hinzugefügt. Wenn Sie ihn wie gewohnt einbinden, geht Ihre Anwendung davon aus, dass diese Symbole in 3.0 vorhanden sind, in denen dies nicht der Fall ist.

Um ein Framework mit einer schwachen Verknüpfung zu versehen, suchen Sie Ihr Anwendungsziel in Xcode, überprüfen Sie es und wechseln Sie zur Registerkarte Allgemein. Unten auf dieser Registerkarte sollte eine Liste der Frameworks mit einer Spalte für Typ angezeigt werden. Ändern Sie den Typ für UIKit von Erforderlich in Schwach und erstellen Sie Ihre Anwendung neu. Das sollte sich um die Laufzeitfehler kümmern.

Ihre bedingte Logik ist solide, aber ich neige dazu, einen Anwendungsdelegierten mit anderen zu teilen und das schnittstellenspezifische Layout später durchzuführen.

(Update: 21.12.2011) Ab iOS 4.2 sollten Sie keine schwachen Link-Frameworks mehr benötigen, um solche Fehler zu vermeiden. Wie Marco Arment beschreibt , wenn Sie mit iOS 4.2 oder höher erstellen und auf iPhone OS 3.1+ abzielen, sind einzelne Klassen jetzt schwach verknüpft und sollten ihre +class -Methode zurückgeben nil, wenn die Klasse auf dem aktuell ausgeführten nicht vorhanden ist Version des Betriebssystems.

66
Brad Larson

Ich hatte einen sehr ähnlichen Fehler und es hat mich verrückt gemacht! :-) Suche nach Stunden und konnte es nicht herausfinden ...

Wie Sie bereits sagten, lief im iPad Simulator alles in Ordnung, aber wenn Sie versuchten, die App auf dem iPhone mit iPhone OS 3.1.2 zu testen, wurde sie nicht gestartet, sondern stürzte mit der folgenden Fehlermeldung ab:

mi_cmd_stack_list_frames Nicht genügend Frames im Stack

Bei der Überprüfung fast jeder Codezeile wurde mir klar, dass die Zuweisung von 3.2-Klassen wie UIPopoverController oder UISplitViewController (bereits in gegabeltem iPad-spezifischem Code) das Problem verursachte.

Also statt d. H .:

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

ich würde schreiben

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

und das löste mein problem! (Das Debuggen kann so schwierig sein, wenn die Fehlermeldung keinen Hinweis darauf gibt, wo der Fehler möglicherweise gefunden wurde ...)

4
xoconoxtle

Xcode 8.3, iPad 2 (verfügbar für Swift 3)

:То помогло мне было:

  • перезапустите Xcode
  • сделать "Продукт -> Очистить"ShiftCommandK
  • перестроить проект
0
CousinCocaine