2013-08-18 3 views
7

Wir haben jetzt eine iOS-App im Angebot, und wir entwickeln die iOS 7-Version auf XCode 5 DP mit der gleichen Codebasis.Schreiben von iOS7-Code, der mit iOS 6 kompatibel ist Basis-SDK

Wir müssen jetzt wirklich ein Update für bestehende iOS 5/6 Kunden veröffentlichen, aber natürlich, wenn wir das Projekt in XCode 4 neu laden, beschwert es sich über nicht existierende Eigenschaften, da das Base SDK dann iOS6 wird , nicht 7:

// Only run this bit on iOS 7 
if ([self respondsToSelector:@selector(setFooForExtendedLayout:)]) 
{ 
    self.fooForExtendedLayout = UIFooEdgeLeft | UIFooEdgeRight; 
} 

float bottomOffset = 0; 
// Only run this bit on iOS 7, else leave bottomOffset as 0 
if ([self.hostController respondsToSelector:@selector(bottomLayoutFoo)]) 
    bottomOffset = self.hostController.bottomLayoutFoo.length; 

(verschleierten NDA zu brechen vermeiden)

XCode Fehler:

Property 'fooForExtendedLayout' nicht auf Objekt gefunden Typ 'UIViewController *'

Verwendung von nicht deklarierter Bezeichner 'UIFooEdgeLeft'

Verwendung von nicht deklarierter Bezeichner 'UIFooEdgeRight'

Property 'bottomLayoutFoo' nicht auf Objekt vom Typ 'UIViewController *' gefunden

Es wäre ein Schmerz, diesen neuen Code zu kommentieren. Was ist der richtige Weg, um es neu zu schreiben, um sowohl mit dem alten als auch dem neuen Base-SDK kompatibel zu sein, und gibt es jetzt (über XCode 4 und gegen iOS 6 SDK gebaut) die Gefahr einer Ablehnung des App-Stores?

Antwort

6

Ich würde empfehlen, zu warten, bis iOS 7 bereit ist, Ihr Update einzureichen.
Sie sind jedoch Möglichkeiten, das Problem zu beheben.

Property ‚fooForExtendedLayout‘ nicht auf Objekt vom Typ ‚UIViewController *‘

Als Eigenschaften sind nur syntaktischer Zucker, die einfache Möglichkeit, diese Art von Fehler zu beheben, ist ein Selektor gefunden zu verwenden, um rufen Sie die Methode (Setter):

[ self performSelector: NSSelectorFromString("setFooForExtendedLayout:") withObject: (id)xxx ]; 

@selector() nicht verwendet werden, da Sie für ein iOS 7 Selektor mit einem iOS 6 SDK zu fragen.
Daher die Verwendung von NSSelectorFromString.
Das Argument withObject wird für Objekte erstellt, wie der Name impliziert. Da Objekte jedoch Zeiger sind und Ihre Methode einen Enum-Wert annimmt, können Sie sie problemlos übergeben, indem Sie einen Cast verwenden.

Verwendung von nicht deklarierter Bezeichner
'UIFooEdgeLeft' Verwendung von nicht deklarierter Bezeichner 'UIFooEdgeRight'

jetzt über Ihre Enum-Werte, gibt es keinen solchen Trick.
Der einzige Weg ist, sie zu deklarieren, mit den gleichen Werten wie in der iOS 7 SDK, und bete, dass es nicht bis zum offiziellen Release ändern wird.

So, jetzt liegt es an dir ... Persönlich würde ich warten.

+0

Das ist genau das, was ich suchte, danke . Danke, dass Sie auch den anderen Teil der Frage beantwortet haben, d. H. Ihre Vorbehalte darüber teilen. –

+0

Gern geschehen ...:) – Macmade

-2

Edit: diese Antwort (und auch die Fragen) ist nicht mehr relevant seit jetzt Xcode 5 ist freigegeben! Bitte beachten Sie dies beim Herunter Abstimmung;)

Die Begründung eines SCM-Tool für die Verwendung von zwei verschiedenen Codezweige erhalten aufgrund subtiler Probleme, die entstehen können, wenn Xcode Developer Preview-Versionen Schalen und eine Xcode Release-Versionen mit einem identisch Xcode-Projekt und die gleiche Code- und Ressourcenbasis. Die Projektdatei und das Storyboard oder XIB können unter der Oberfläche geändert werden und möglicherweise beschädigt werden. Es ist nicht, weil es keine Möglichkeit geben würde, eine Lösung im Code zu finden! Nichtsdestoweniger würde ich nicht empfehlen, mit verschiedenen Xcode-Versionen auf dem identischen Xcode-Projekt zu arbeiten. Dies kann Kopfschmerzen verursachen!


Der richtige Weg ist, ein Quellcode-Management-Tool wie Git zu verwenden. Sie sollten einen Zweig "iOS 6" haben, in dem Sie Release-Versionen pflegen, und Sie sollten einen oder mehrere Entwicklungszweige haben, in denen Sie Vorabversionen von Xcode und iOS verwenden.

+0

Ich verstehe Ihren Punkt, aber die Frage war, wie man den Code geschrieben, so dass es gegen beide SDKs kompilieren würde. –

+0

Ist es besser, eine verrückte Lösung für ein Problem zu verwenden, das leicht vermieden werden kann? – CouchDeveloper

+0

Ich weiß, ich weiß ... ... es ist eine gute Frage und ich stimme dir zu. Es ist jedoch nicht ** diese ** Frage. –

5

könnten Sie verwenden:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
{ 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 
#endif 
+1

Was/wo ist SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO? – daidai

+0

Es ist ein Makro: #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (v) ([[[UIDevice currentDevice] systemVersion] vergleichen: v Optionen: NSNumericSearch]! = NSOrderedAscending) – Alena

1
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
{ 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 
#endif 
7

Hier ist der recommended way ist Code zu haben, die sowohl auf iOS 6 und 7 SDK kompiliert:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 
    if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) 
     self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight; 
#endif 
+0

thanks! Das hat mir geholfen –