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?

laufen

Stattdessen 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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top