2010-05-03 19 views
10

Pracuję nad nową aplikacją, która ma być uniwersalna dla iPhone'a i iPada. Zacząłem od kreatora "Utwórz aplikację opartą na oknach" i utworzyłem osobnych delegatów aplikacji w grupach "iPhone" i "iPad". Ponieważ już dobrze znałem iPhone'a, wykonałem tę część mojego projektu, a teraz jestem gotów zrobić kilka rzeczy na iPada.Jak uruchomić aplikację uniwersalną na symulatorze iPhone 3.1.3?

Więc ... Zacząłem od dodania kontrolera UISplitViewCentrator do mojego delegata na iPada, przełączam Active SDK na 3.2 i działa! Ale kiedy przełączam się z powrotem do wersji 3.1.3 i próbuję uruchomić go w symulatorze, budowanie i uruchamianie kończy się niepowodzeniem. Na początek widzę:

Mam zestaw Base SDK ustawiony na 3.2, a mój docelowy wdrożenia ustawiony na 3.1.3. Myślałem, że to wystarczy. Ale znalazłem również w dokumentacji tej metody warunkowo kompilacji:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 
    MyIPadViewController* vc; 
// Create the iPad view controller 
#else 
    MyIPhoneViewController* vc; 
// Create the iPhone view controller 
#endif 

Czy muszę to robić wszędzie? Wygląda na to, że do dodania jest bardzo dużo kodu (że i tak pozbędę się w krótkim czasie na 4.0), więc czuję, że muszę zrobić coś złego. I nawet nie mam pojęcia, jak to działa dla rzeczy takich jak deklaracje @property lub @synthesize.

tl; dr wersja pytania - czy brakowało mi jakiegoś ustawienia?

+0

Odpowiedź progrmr jest bardziej odpowiednia, zaakceptuj ją tak, aby czytelnicy mogli łatwo uzyskać właściwą odpowiedź. –

Odpowiedz

23

Wręcz przeciwnie. Uniwersalna aplikacja uruchamia ten sam plik binarny na iPhonie i iPadzie, więc nie można użyć kompilacji warunkowej do rozróżnienia obu wersji. Ale trzeba użyć makro Jabłko cytuje w dokumentacji:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    // iPad-specific code 
} else { 
    // iPhone-specific code 
} 
+0

Jak dodać coś do pliku nagłówkowego, gdzie deklaruję zmienną typu UISplitViewController? Powinienem mieć w sobie blok if/else? – bpapa

+0

Nie, możesz to po prostu zadeklarować. Zbuduj dla urządzenia iPhone 3.2 i będzie działać na Twoim urządzeniu 3.0/3.1. –

+0

Warunkowe bloki kompilacji są przydatne, jeśli chcesz przetestować swoją aplikację w Symulatorze iPhone 3.1, ponieważ (ponieważ Symulator 3.2 nie obsługuje uruchamiania aplikacji uniwersalnej w trybie iPhone'a). –

39

używam tej funkcji C, aby pomóc zachować zwięzły kod:

BOOL isPad() { 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 
} 

Inną rzeczą, którą robię, kiedy mam różne pliki XIB dla iPhone'a i iPada. Mam funkcji stripPadSuffixOnPhone(), która pomaga zachować kod prostsze:

// Load/create the Delete table cell with delete button 
self.deleteCell = [Utilities loadNib:stripPadSuffixOnPhone(@"DeleteCell~ipad") 
          ClassName:@"DeleteCell" 
        Owner:self]; 

Takie rzeczy można zrobić kodowanie prostsze i dużo mniej warunkowe. Nadal jednak muszę przetestować wszystko dwa razy.

+0

Będzie świetnie, jeśli podzielisz się z nami swoją "Utilities"! : P :);) – rptwsthi

+2

Są na [github] (https://github.com/progrmr/SDK_Utilities/tree/master/Utils) – progrmr

0

Oto, co działa dla mnie:

  1. Zbuduj swoją aplikację za pomocą SDK 3.2.
  2. Przełącz aktywny SDK na iPhone Simulator 3.1.3 (lub cokolwiek innego).
  3. Z menu Uruchom wybierz opcję Debuguj (nie kompiluj i debuguj).

Binarny zbudowany w wersji 3.2 zostanie zainstalowany w symulatorze 3.x bez przebudowy. Po zakończeniu nie zapomnij ustawić aktywnego zestawu SDK z powrotem na 3.2.

+0

Zainstalowana w pakiecie wersja 3.2 SDK usuwa zestawy SDK 3.1.x, więc nie można ustawić ich jako aktywnego zestawu SDK. –

Powiązane problemy