Universal-iPhone / iPad-Anwendung Debug-Kompilierungsfehler für iPhone Test
-
26-09-2019 - |
Frage
Ich habe ein iPhone und iPad Universal-App geschrieben, die fein in dem iPad-Simulator auf Xcode läuft, aber ich würde jetzt wie die iPhone-Funktionalität zu testen. Ich scheine nicht in der Lage, das iPhone Simulator mit diesem Code, wie es standardmäßig immer auf das iPad?
laufenStattdessen habe ich versucht, auf dem Gerät ausgeführt werden und wie es zu laufen beginnt ich die folgende Fehlermeldung erhalten:
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
Wie die App integriert ist programmatisch anstatt XIB den habe ich spalte die zwei Gerätelogiken der folgenden Zeilen in der main.m Methode:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}
Von diesem Punkt her sie verschiedenes AppDelegates verwenden und ich habe meine Header überprüft die UISplitView, um sicherzustellen, wird über das Telefon Logik nie benutzen noch importiert werden.
Wie kann ich diesen Fehler vermeiden und gibt es einen besseren Weg, um die universellen Logikpfade in dieser programmatisch erstellen App aufgeteilt?
Lösung
Dieser Fehler ausgelöst wird, weil Sie nicht schwach koppel des UIKit Rahmen tun. Der UIKit Rahmen in iPhone OS 3.2 die UISplitViewController hinzugefügt, und wenn Sie es verknüpfen in normal Ihre Anwendung werden diese Symbole existieren auf 3,0 annehmen, wo sie es nicht tun.
Um Weak-Link ein Framework, finden Sie Ihr Anwendungsziel in Xcode, kontrollieren Sie es, und auf die Registerkarte Allgemein gehen. Am unteren Ende dieser Registerkarte sollte eine Liste von Frameworks, mit einer Spalte für Typen sein. Ändern Sie den Typ für UIKit von Required zu schwach und die Anwendung neu zu erstellen. Das sollte der Laufzeitfehler kümmern.
Ihre bedingte Logik ist Klang, aber ich neige dazu, eine Anwendung delegieren und tun, um die Schnittstelle spezifische Layout weiter auf der ganzen Linie zu teilen.
(Update: 12/21/2011) Ab iOS 4.2, sollten Sie nicht mehr benötigte schwaches Glied Frameworks Fehler wie diese zu verhindern. Wie Marco Arment beschreibt , wenn Sie mit iOS 4.2 oder höher und Ziel nach unten auf dem iPhone O 3.1+, einzelne Klassen sind jetzt schwach verknüpft bauen und ihre +class
Methode Rückkehr nil
haben sollten, wenn die Klasse nicht von den OS auf die aktuell laufende Version nicht vorhanden ist.
Andere Tipps
Ich habe einen sehr ähnlichen Fehler aufweisen und es machte mich verrückt! :-) stundenlang Suche und es nicht herausfinden könnte ...
Wie Sie schon sagten, war alles in Ordnung, wenn sie im iPad Simulator läuft, aber wenn die App auf dem iPhone mit iPhone OS 3.1.2 zu testen versucht, wäre es nicht einmal starten, aber Absturz mit der folgenden Fehlermeldung:
mi_cmd_stack_list_frames nicht genug Frames im Stapel
Mit dem fast jeder Zeile Code Überprüfung stellte ich fest, dass die Zuweisung von 3,2 Klassen wie UIPopoverController oder UISplitViewController (bereits innerhalb gegabelt iPad-spezifischer Code) wurde das Problem verursacht.
Also anstatt das heißt:.
infoPopover = [[UIPopoverController alloc] initWithContentViewController: infoNavController];
ich würde schreiben
infoPopover = [[NSClassFromString (@ "UIPopoverController") alloc] initWithContentViewController: infoNavController];
Und das mein Problem gelöst! (Debugging kann so hart sein, wenn die Fehlermeldung gibt Ihnen keine Ahnung, wo der Fehler möglicherweise gefunden werden kann ...)
Xcode 8.3, iPad 2 (nicht Retina), Swift 3-Code
Was für mich geholfen war:
- Neustart Xcode
- Sie ein Produkt -> Clean ' Umschalttaste Befehl K
- Erstellen Sie das Projekt