Mit der Entwicklung für das iPad wurde das SDK auf 3.2 gehoben. Um das iPhone vom iPad unterscheiden zu können, sieht Apple folgende Abfrage vor:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
     // iPad mit iPhone 3.2 oder neuer.
} else {
     // Das Gerät ist ein iPHone oder iPod touch.
}

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/StartingYourProject/StartingYourProject.html

Das userInterfaceIdiom steht aber erst unter 3.2 und neuer zur Verfügung, sodass die o.g. Abfrage auf Geräten mit iPhone OS kleiner 3.2 zu einem Fehler führt.

Nutzt man zur Kontrolle ein altes Xcode (z.B. 3.1.4) so kann man sehen, dass dieser Code unbekannt ist und schon zur Compilezeit Fehler wirft.

Bildschirmfoto 2010-06-28 um 08.34.04-s.png

Um die Unterscheidung auch in 3.2 treffen zu können, bietet es sich an, die Abfrage durch ein ifdef zu beschränken. Abhängig davon, ob die Funktion im Framework verfügbar ist, wird der enthaltene Code ausgeführt oder nicht.

BOOL iPad = NO;
#ifdef UI_USER_INTERFACE_IDIOM
	iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
#endif
	if (iPad) {
		nibName = @"MainView-iPad";
	} else {
		nibName = @"MainView";
	}

Der Trick ist also, davon auszugehen, dass man per Default nicht auf einem iPad läuft. Sollte man sich auf einem System befinden, das 3.2 oder höher (z.B. iOS 4) läuft, so wird die Auswertung vorgenommen. Im Falle eines Gerätes mit iOS 4 würde die Auswertung immernoch NO (False) ergeben, da es sich nicht um ein iPad handelt. Nur wenn es wirklich ein iPad ist, wird auch das nib-File für das iPad geladen.

Somit läuft der Code auf allen Geräten ab 3.0.