Frage

Ich habe Probleme mit meinem Universal-App mit. Ich habe die Basis SDK iPhone gesetzt 3.2 und das Ziel auf 3,1 eingestellt.

Ich habe die Dateien verschoben, die die UIPopoverController auf ihre eigenen Dateien verwenden, und sie sollten nicht geladen werden, wenn der App auf dem iPhone zu laden. Dennoch, wenn ich meine app baue ich folgende Fehlermeldung erhalten, wenn ich mein Gerät zu bauen und zu debuggen zu:

  

dyld: Symbol nicht gefunden:   _OBJC_CLASS _ $ _ UIPopoverController referenzierten aus:   /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes   Erwartete in:   /System/Library/Frameworks/UIKit.framework/UIKit   im   /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

Ich hoffe wirklich, dass jemand mir helfen kann.

Mit freundlichen Grüßen, Paul Peelen

War es hilfreich?

Lösung

Auch wenn sie nicht in der Laufzeit geladen sind, werden diese Dateien immer noch in Verknüpfung verarbeitet. Das Symbol _OBJC_CLASS_$_UIPopoverController wird deshalb hinzugefügt in Ihre App als einer von denen, erfordern eine dynamische Verbindung.

Es gibt zwei Workarounds,

  1. Alle ersetzen Aussehen UIPopoverController in einer Nachricht (z [UIPopoverController alloc]) mit NSClassFromString(@"UIPopoverController"), oder
  2. Stellen UIKit schwach verknüpft.

Andere Tipps

Ich empfehle Ihnen dringend, nicht schwach Link UIKit. Als KennyTM und ich in unseren Kommentaren erwähnt, kann diese Zukunft Linker Fragen verstecken und zu Abstürzen führen. Ich bin auch einfach nicht wohl mit zu sagen, den Linker dass UIKit optional ist, wenn es offensichtlich nicht. Big Hack.

Stattdessen initialisieren und rufen UIPopoverController indirekt NSClassFromString mit:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}

Wenn Sie noch Linkerfehler haben, können Sie anrufen müssen UIPopoverController Botschaften NSSelectorFromString mit:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}

Für Portabilität, empfehle ich ein Proxy-Objekt zu schreiben, diese Implementierungsdetails zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top