<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2germanfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>iOsDevGermany</title>
	
	<link>http://www.iosdevgermany.de</link>
	<description>Deutsche iPhone App Tutorials</description>
	<lastBuildDate>Thu, 24 May 2012 20:01:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/iosdevgermany" /><feedburner:info uri="iosdevgermany" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>iosdevgermany</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=de&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://us.i1.yimg.com/us.yimg.com/i/de/my/addtomyyahoo4.gif">Subscribe with Mein Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/iosdevgermany" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fiosdevgermany" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>iPad Tutorial deutsch – Split View Controller</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/dISKGDZGAOo/</link>
		<comments>http://www.iosdevgermany.de/tutorial/ipad-tutorial-deutsch-split-view-controller/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 20:21:16 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[Split View Controller]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[Swipe Geste]]></category>
		<category><![CDATA[UITableView]]></category>
		<category><![CDATA[Web View]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Xcode 4.3]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=1423</guid>
		<description><![CDATA[Einleitung In diesem Tutorial soll es diesmal um das iPad gehen. Um genau zu sein, um den Split View Controller. Mehr dazu weiter unten. Was Du in diesem Tutorial lernen wirst: Implementieren eines Split View Controllers ohne Template Kommunikation zwischen &#8230; <a href="http://www.iosdevgermany.de/tutorial/ipad-tutorial-deutsch-split-view-controller/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p style="text-align: left;"><strong>Einleitung</strong></p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Artikelbild.png"><img class="alignleft  wp-image-1507" title="iPad Split View Tutorial - Artikelbild" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Artikelbild.png" alt="" width="285" height="285" /></a>In diesem Tutorial soll es diesmal um das iPad gehen. Um genau zu sein, um den Split View Controller. Mehr dazu weiter unten.</p>
<p style="text-align: left;">Was Du in diesem Tutorial lernen wirst:</p>
<ul>
<li>Implementieren eines Split View Controllers ohne Template</li>
<li>Kommunikation zwischen Master und Detail View</li>
<li>Master View mit der Swipe-Geste erscheinen und verschwinden lassen</li>
</ul>
<p>So wird die fertige App dann aussehen: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorialVideo.m4v">Video</a></p>
<p><span id="more-1423"></span></p>
<p><strong>1. iPad Apps</strong></p>
<p>Das Entwickeln von Apps für das iPad unterscheidet sich grundlegend nicht von der Entwicklung von Apps für das iPhone. Deshalb werde ich in diesem Tutorial nicht bei null beginnen. Wer noch neu in der iOS-Entwicklung ist, kann mit dem <a title="Einsteiger Tutorial deutsch – Eine eigene App entwickeln" href="http://www.iosdevgermany.de/tutorial/einsteiger-tutorial-deutsch-eine-eigene-app-entwickeln/">Einsteiger Tutorial</a> beginnen. Dieses ist zwar für das iPhone geschrieben, das Wissen ist aber übertragbar.</p>
<p>Der größte Unterschied zwischen iPhone und iPad Apps, ist die verfügbare Display-Größe. Man sollte diese beim iPad immer optimal nutzen. Ein Beispiel:</p>
<p>Wenn man eine Produkt-Katalog App für das iPhone entwickelt, wird man höchstwahrscheinlich in einem Table View die Produkte auflisten und sobald der User eine Zeile auswählt, erscheinen Details über das Produkt in einem neuen View. Das wäre dann eine ganz simple Master-Detail-View App. Der Table View ist der Master View und von diesem aus gelangt man in den Detail View, der Details anzeigt.</p>
<p>Möchte man diese App auf das iPad übertragen, so wäre es nicht sinnvoll diese genauso aufzubauen. Dann hätte man nämlich einen riesigen Table View, in dem nur ganz klein auf der linken Seite die Produktnamen stehen. Das ist ziemlich unpraktisch. Deshalb hat Apple für das iPad einen weiteren View Controller entworfen, den sogenannten <em>Split View Controller</em>. Auch dieser besteht aus einem Master und einem Detail View. Allerdings sind diese beiden Views in einem einzigen View integriert.</p>
<p>Ein Beispiel für so einen Split View ist die Einstellungen-App auf dem iPad.</p>
<p><img class=" wp-image-1427 aligncenter" title="iPad Tutorial - Split View Beispiel" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadTutorial-SplitViewBeispiel1-793x1024.png" alt="" width="640" height="826" /></p>
<p>Links befindet sich der Master View in Form eines Table Views und rechts der Detail View.</p>
<p>Wir werden in diesem Tutorial eine Art Mini-Webbrowser entwickeln. Im Master View kann der User eine Bookmark auswählen und die Website wird dann im Detail View angezeigt. Im Gegensatz zur Einstellungen App kann der User in unserer App den Master View mit einem Button oder einer Wischgeste ein und ausblenden.</p>
<p><strong>2. Der Split View Controller</strong></p>
<p>Öffne Xcode und erstelle ein neues Projekt. Als Template verwenden wir das Single View Application Template. Das Master-Detail Application Template würde zwar schon einen fertig implementierten Split View Controller enthalten, allerdings sollte man wissen, wie man diesen von Hand einbaut. Wenn Du das Single View Application Template ausgewählt hast, erscheinen die Projekt-Settings. Hier kannst Du wie immer den Projekt-Namen eingeben, bspw. &#8220;SplitViewTutorial&#8221;. Allerdings müssen wir diesmal den Wert bei <em>Device Family</em> auf &#8220;iPad&#8221; einstellen. Ansonsten sollte aber alles wie immer sein:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Projekt_Einstellungen.png"><img class="alignleft size-full wp-image-1429" title="iPad Split View Tutorial - Projekt Einstellungen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Projekt_Einstellungen.png" alt="" width="730" height="491" /></a></p>
<p>Speichere im nächsten Fenster das Projekt ab.</p>
<p>Wir bleibe gleich mal bei der bereits geöffneten Projekt-Datei. Eine Einstellung lautet da nämlich <em>Supported Device Orientations</em>. Anders als bei einem iPhone-Projekt sind hier standardmäßig alle <em>Orientations</em> aktiviert. Das sollte man bei einer iPad App auch möglichst nicht ändern, da der User einfach erwarten, dass die App in allen Positionen funktioniert.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Supported_Device_Orientations.png"><img class="aligncenter size-large wp-image-1432" title="iPad Split View Tutorial - Supported Device Orientations" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Supported_Device_Orientations-1024x773.png" alt="" width="640" height="483" /></a></p>
<p>Gehen wir weiter zum Storyboard. Öffne die Datei &#8220;MainStoryboard.storyboard&#8221; und wie Du siehst, siehst Du nichts <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Das liegt daran, dass ein iPad View im Storyboard in Normalgröße angezeigt wird und das ist recht groß. Für mehr Überblick kannst Du einfach auf die Lupe mit dem Minussymbol in der rechten, unteren Ecke klicken.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Storyboard.png"><img class="aligncenter size-full wp-image-1435" title="iPad Split View Tutorial - Storyboard" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Storyboard.png" alt="" width="702" height="862" /></a></p>
<p>Bevor wir mit der Implementierung des Split Views beginnen, kannst Du dich erstmal überzeugen, dass alles genauso wie beim iPhone funktioniert. Ziehe einfach wahllos Objects, wie Labels, Buttons oder Textfelder in den View (dazu musst Du wieder heranzoomen). Beachte beim Starten der App, dass bei <em>Scheme</em> in der Toolbar der &#8220;iPad 5.1 Simulator&#8221; steht. Das bedeutet, dass die App im iPad Simulator angezeigt wird. <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-iPad-Simulator.png"><img class="aligncenter size-full wp-image-1436" title="iPad Split View Tutorial - iPad Simulator" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-iPad-Simulator.png" alt="" width="458" height="86" /></a></p>
<p>Als nächstes löschen wir den View Controller im Storyboard, da wir ja mit einem Split View Controller beginnen wollen. Zoome dazu im Storyboard wieder heraus, klicke auf das schwarze Dock des Controllers und lösche ihn mit der Backspace-Taste.</p>
<p>Dann suche in der Library nach dem Split View Controller und ziehe ihn in den Editor-Bereich.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Split_View_Controller.png"><img class="aligncenter size-large wp-image-1439" title="iPad Split View Tutorial - Split View Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Split_View_Controller-1024x747.png" alt="" width="640" height="466" /></a></p>
<p>Auf den ersten Blick ist das ein ziemlich wirres Geflecht.</p>
<p>Ganz links ist der Split View Controller. Dieser ist ein sogenannter <em>Container View Controller</em>. &#8220;Container&#8221; deshalb, weil er andere Controller enthält, welche man dann als seine <em>Child View Controller</em> bezeichnet. Der Container View Controller, den man als <em>Parent View Controller</em> bezeichnet, kümmert sich um die Präsentation der Child View Controller. Beispiele für Container View Controller sind der Navigation Controller, der dafür sorgt, dass jeder Child View eine Navigation Bar hat, oder der Tab Bar Controller, der zu jedem Child View eine Tab Bar hinzufügt.<br />
Unser Split View Controller ist eben ein weiterer Container View Controller und sorgt dafür, dass seine Child View Controller gesplittet angezeigt werden. In diesem Fall sind das ganze drei weitere Controller, alle verbunden durch eine Relationship. Eine Relationsship wird wie eine Segue als Pfeil dargestellt, allerdings hat der Kreis des Pfeil ein anderes Symbol.</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Relationsship.png"><img class="aligncenter  wp-image-1440" title="iPad Split View Tutorial -Relationsship" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Relationsship.png" alt="" width="177" height="377" /></a></p>
<p style="text-align: left;">Links oben befindet sich dann ein Navigation Controller, auch wieder ein Container View Controller. Man sieht also, dass ein Container View Controller auch einen Container View Controller enthalten kann. Rechts daneben befindet sich dann ein Table View Controller, der als Master View Controller dient. In diesem Master View Controller wird der User ein Lesezeichen auswählen können.</p>
<p style="text-align: left;">Der View Controller unten ist der Detail View Controller, in welchem die Website des im Master View Controller ausgewählten Lesezeichen angezeigt wird.</p>
<p style="text-align: left;">Und schon ist das ganze viel übersichtlicher: Oben Master View, unten Detail View und ganz links der Split View Controller.</p>
<p style="text-align: left;"><strong>3. Der Detail View Controller</strong></p>
<p>Zuerst wollen wir den Detail View gestalten.</p>
<p>Damit der User später den Master View Controller über einen Button anzeigen kann, müssen wir eine Top Bar anlegen, auf der wir den Button platzieren. Eine Top Bar ist einfach eine Bar am oberen Rand des Views. Statt wie sonst eine Navigation Bar zu verwenden, werden wir diesmal eine Toolbar einfügen, da wir ja nur einen Button platzieren und nicht durch mehrere Views navigieren wollen.</p>
<p>Suche also eine Toolbar aus der Library und ziehe sie an den oberen Rand des Detail View Controllers.</p>
<p><em>Hinweis: Wer einen großen Bildschirm hat, kann das Xcode Fenster einfach etwas vergrößern, damit das Platzieren der Objects leichter fällt.</em></p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Toolbar.png"><img class="aligncenter  wp-image-1456" title="iPad Split View Tutorial - Toolbar" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Toolbar.png" alt="" width="580" height="415" /></a></p>
<p style="text-align: left;">Auf der Toolbar befindet sich standardmäßig ein Button, den wir aber nicht benötigen, da wir später einen Button für den Master View im Code erstellen werden. Wähle also den Button im Document Outline aus und lösche ihn mit der Backspace-Taste.</p>
<p style="text-align: left;">Wie ich am Anfang erwähnt habe, sollte man eine iPad App immer für alle Orientations auslegen. Es kann also auch sein, dass unsere App im Landscape-Mode verwendet wird. Für diesen Fall müssten wir einstellen, dass sich die Toolbar automatische an die neue Breite anpasst. Wähle sie dazu aus und öffne den <em>Size inspector</em>. Auf der linken Seite befindet sich ein Bild mit roten Pfeilen und Stützen, unter dem <em>Autoresizing</em> steht. Wenn man die roten Linien anklickt, kann man sie entweder aktivieren oder deaktivieren. Ändere die Einstellungen so ab, dass das Bild wie folgt aussieht:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitView-Toolbar_Autoresizing.png"><img class="aligncenter size-full wp-image-1458" title="iPad Split View - Toolbar Autoresizing" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitView-Toolbar_Autoresizing.png" alt="" width="260" height="326" /></a></p>
<p style="text-align: left;">Das bewirkt, dass die Tool Bar immer am oberen Rand des Views und in voller Breite angezeigt wird.</p>
<p style="text-align: left;">Als nächstes fügen wir einen Web View hinzu, in dem wir später die Website des im Master View ausgewählten Lesezeichens anzeigen werden. Ziehe dazu einen Web View aus der Library in den Detail View Controller und passe seine Größe an den verfügbaren Platz an:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitView-WebView.png"><img class="aligncenter size-large wp-image-1460" title="iPad Split View - Web View" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitView-WebView-745x1024.png" alt="" width="640" height="879" /></a></p>
<p style="text-align: left;">Noch haben wir dem Detail View Controller im Storyboard keine Klasse zugewiesen. Damit wir keine neuen Dateien erstellen müssen, verwenden wir einfach &#8220;ViewController.h&#8221; und &#8220;ViewController.m&#8221;. Wähle also den Detail View Controller aus, indem Du auf das schwarze Dock klickst und öffne den Identity inspector. Gib bei <em>Class</em> einfach &#8220;ViewController&#8221; ein.</p>
<p style="text-align: left;">Jetzt können wir die Outlets für die Toolbar und den WebView erstellen. Schalte auf Assistant Editor um (s. Bild: rechts oben) und klicke im Document Outline mit gedrückter ctrl-Taste auf die Toolbar. Halte die Taste gedrückt und ziehe den blauen Faden in &#8220;ViewController.h&#8221; über @end. Nenne das Outlet &#8220;toolbar&#8221; und wiederhole diesen Schritt für den WebView (nenne ihn &#8220;webView&#8221;).</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitView-Outlets_erstellen.png"><img class="aligncenter size-large wp-image-1463" title="iPad Split View - Outlets erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitView-Outlets_erstellen-1024x655.png" alt="" width="640" height="409" /></a></p>
<p style="text-align: left;">Stelle, wenn Du fertig bist, wieder auf Standrad Editor um.</p>
<p style="text-align: left;">Da wir mit dem Split View Controller arbeiten, müssen wir noch das &lt;UISplitViewControllerDelegate&gt; einbinden. Ändere die @interface Zeile in &#8220;ViewController.h&#8221; wie folgt ab:</p>
<pre class="brush: objc; title: ; notranslate">@interface ViewController : UIViewController &lt;UISplitViewControllerDelegate&gt; </pre>
<p>Als nächstes folgt die Standard-Implementierung für den Split View Controller.<br />
Dafür benötigen wir zuerst einen sogenannten Popover Controller. Für was wir diesen benötigen, dazu komme ich später.</p>
<p>Öffne die Datei &#8220;ViewController.<strong>m</strong>&#8221; und schreibe folgendes unter die <strong>@implementation</strong>-Zeile:</p>
<pre class="brush: objc; title: ; notranslate">{
    UIPopoverController *masterPopoverController;
}</pre>
<p>So sollte das dann aussehen:<br />
<a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-PopoverController.png"><img class="aligncenter size-full wp-image-1464" title="iPad Split View Tutorial - Popover Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-PopoverController.png" alt="" width="688" height="530" /></a></p>
<p>Das besondere hieran ist, dass wir eine Instanzvariable der Klasse ViewController nicht wie sonst in der Header-Datei (.h) deklariert haben, sondern in der Implementierungs-Datei (.m). Dieses Feature, Instanz-Variablen in der .m-Datei zu speichern, hat man eingeführt, um die Header-Dateien sauberer und übersichtlicher zu halten. Wenn möglich sollten nur properties in der Header-Datei deklariert werden und keine normalen Instanz-Variablen. Für die App selbst macht es aber keinen Unterschied.</p>
<p>Als nächstes fügen wir die Standard-Methode hinzu, die man einfach benötigt, wenn man mit einem Split View Controller arbeitet. Füge diese beiden Methode über @end in &#8220;ViewController.m&#8221; ein:</p>
<pre class="brush: objc; title: ; notranslate">// Standard-Methoden für einen SplitViewController
-(void) splitViewController:(UISplitViewController *)svc
     willHideViewController:(UIViewController *)aViewController
          withBarButtonItem:(UIBarButtonItem *)barButtonItem
       forPopoverController:(UIPopoverController *)pc {

    barButtonItem.title = @&quot;Lesezeichen&quot;;
    NSMutableArray *items = [[self.toolbar items] mutableCopy];
    [items insertObject: barButtonItem atIndex: 0];
    [self.toolbar setItems:items animated:YES];
    masterPopoverController = pc;
}

-(void) splitViewController:(UISplitViewController *)svc
     willShowViewController:(UIViewController *)aViewController
  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
    NSMutableArray *items = [[self.toolbar items] mutableCopy];
    [items removeObject:barButtonItem];
    [self.toolbar setItems:items animated:YES];
    masterPopoverController = nil;
}
</pre>
<p><em>Hinweis: Bei beiden Funktionen geht der Funktions-Kopf über mehrere Zeilen.</em></p>
<p>Die erste Methode wird aufgerufen, wenn das iPad gedreht wird. Wie Du im obigen Video siehst, wird der Master View im Landscape Mode, also im breiten Format, ständig angezeigt. Dreht man das iPad allerdings wieder in den Portrait Mode, so erscheint ein Button, mit dem man den Master View ein- und ausblenden kann.</p>
<p><em>splitViewController:willHideViewController:withBarButtonItem:forPopoverController: </em>wird also immer dann aufgerufen, wenn das iPad zurück in den Portrait Mode gedreht wird. Deshalb erstellen wir in dieser Methode den besagten Button namens &#8220;Lesezeichen&#8221;. Etwas seltsam ist hier, dass wir erst noch ein Array namens <em>items</em> deklarieren. Das wird deswegen gemacht, da die Toolbar eventuell (in unserem Fall zwar nicht) noch weitere Buttons enthalten könnte. Wir erstellen also zuerst ein Array, in welchem wir alle Bar Button Items speichern (<span style="text-decoration: underline;">Zeile 8</span>) und fügen dann an erster Stelle, also ganz links, den neuen Button ein (<span style="text-decoration: underline;">Zeile 9</span>). Mit <em>[self.toolbar setItems...]</em> weisen wir dann der Toolbar die Items zu (<span style="text-decoration: underline;">Zeile 10</span>). In der letzen Zeile erhält unsere vorhin erstellte Instanz-Variable <em>masterPopoverController</em> noch den Wert &#8220;pc&#8221;. pc ist ein Argument der Methode und ist vom Typ <em>UIPopoverController</em>. Ein Popover Controller ist im Split View immer der Controller, der durch Drücken des Buttons geöffnet wird, also der linke View Controller. In unserer App ist dies auch gleich der Master View Controller, weshalb wir ihn der Instanz-Variable <em>masterPopoverController</em> zuweisen (diese Variable werden wir später noch verwenden).</p>
<p>Zu beachten ist, dass der seitliche View Controller im Landscape Mode <strong>kein</strong> Popover Controller ist, sondern einfach nur ein seitlicher View Controller.</p>
<p>Die zweite Methode macht genau das Gegenteil. Sie wird aufgerufen, wenn das iPad wieder in den Landscape Mode gedreht wird. Wir erstellen zuerst wieder ein Array mit den Button Items unserer Toolbar (<span style="text-decoration: underline;">Zeile 16</span>) und löschen aus diesem Array den &#8220;Lesezeichen&#8221;-Button, der im Argument <em>barButtonItem</em> gespeichert ist (<span style="text-decoration: underline;">Zeile 18</span>). Das überarbeitete Items-Array weisen wir dann wieder der Toolbar zu (<span style="text-decoration: underline;">Zeile 19</span>). Da wir im Landscape Mode keinen Popover Controller mehr haben, sondern nur einen links eingefügten Master View Controller, setzen wir <em>masterPopoverController</em> auf nil (<span style="text-decoration: underline;">Zeile 20</span>).</p>
<p>Mit dem Detail View Controller sind wir für&#8217;s Erste fertig.</p>
<p><strong>4. Der Master View Controller</strong></p>
<p>Als nächstes kümmern wir uns um den Master View Controller, in welchem der User ein Lesezeichen auswählen kann. Öffne &#8220;MainStoryboard.storyboard&#8221;. Der Master View besteht aus einem Navigation Controller und einem Table View Controller. Für diesen Table View müssen wir, wie immer, eine Data Source, also den Inhalt der Tabelle, erstellen. Dazu wiederum benötigen wir die Header- und Implementierungs-Datei des Controllers.</p>
<p>Klicke mit der rechten Maustaste auf den Projekt-Ordner &#8220;SplitViewTutorial&#8221; im <em>Project Navigator </em>und wähle <em>New File&#8230; </em>Klicke dann doppelt auf <em>Objective-C class</em> in der Kategorie <em>Cocoa Touch</em>. Gib bei <em>Class</em> &#8221;BookmarksMasterViewController&#8221; und bei <em>Subclass of</em> &#8221;UITableViewController&#8221;. Stelle außerdem sicher, das der Haken bei <em>Targeted for iPad</em> <strong>gesetzt</strong> ist.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-BookmarksMasterViewController.png"><img class="aligncenter size-full wp-image-1480" title="iPadSplitViewTutorial - BookmarksMasterViewController" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-BookmarksMasterViewController.png" alt="" width="730" height="493" /></a></p>
<p>Klicke auf <em>Next </em>und speichere die Dateien ab.</p>
<p>Bevor wir diese neuen Dateien bearbeiten, begib dich noch einmal ins Storyboard und wähle den Table View Controller aus. Öffne dann den Identity inspector und gib bei Class &#8220;BookmarksMasterViewController&#8221; ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Dateien_dem_Controller_zuweisen.png"><img class="aligncenter size-full wp-image-1482" title="iPadSplitViewTutorial - Dateien dem Controller zuweisen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Dateien_dem_Controller_zuweisen.png" alt="" width="663" height="432" /></a></p>
<p><em>Hinweis: Wenn Du dich noch nicht mit Table Views im Storyboard auskennst, solltest Du vorher das Tutorial <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 2 – Table View" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/">Storyboard Part 2</a> durchlesen.</em></p>
<p>Da wir ja schon im Storyboard sind, können wir gleich noch den <em>Cell Identifier</em> für die Zeilen des Master View Controllers festlegen. Wähle dazu die <em>Prototype Cell</em> aus und öffne den Attributes inspector. Gib bei <em>Identifier</em> &#8221;BookmarkCell&#8221; ein. Stelle außerdem bei <em>Style</em> den Wert auf &#8220;Basic&#8221;.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Table_View_konfigurieren.png"><img class="aligncenter size-full wp-image-1483" title="iPadSplitViewTutorial - Table View konfigurieren" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Table_View_konfigurieren.png" alt="" width="663" height="427" /></a></p>
<p>Öffne jetzt die Datei &#8220;BookmarksMasterViewController.<strong>m</strong>&#8221; Am Datei-Anfang, unter <em>#import &#8220;&#8230;&#8221; </em>befinden sich Zeilen, die da nicht hingehören zu scheinen:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Private_Instanz_Variablen.png"><img class="aligncenter size-full wp-image-1484" title="iPadSplitViewTutorial - Private Instanz-Variablen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-Private_Instanz_Variablen.png" alt="" width="729" height="396" /></a></p>
<p>Hier befindet sich seltsamerweise ein <em>@interface&#8230;</em> in der .m-Datei. Das erinnert ein wenig an die geschweiften Klammern unter @implementation (s. weiter oben im Tutorial). Der Zweck ist aber ein anderer. Zwischen @interface und @end in der .m-Datei können Properties und Methoden deklariert werden. Diese Properties und Methoden sind dann <em>privat (engl. private)</em>. Private Properties bzw. Methoden sind nur innerhalb der Datei &#8220;BookmarksMasterViewController.m&#8221; gültig. Also nur die Klasse selber kann diese Properties/Methoden nutzen. Wollte man von einer anderen Klasse aus auf die Property zugreifen bzw. die Methode aufrufen, so würde man einen Fehler erhalten, da die Property außerhalb der BookmarksMasterViewController-Klasse nicht existiert.</p>
<p>Da wir das Array mit den Lesezeichen nur innerhalb der Klasse verwenden und nicht von außen darauf zugreifen werden, deklarieren wir es zwischen @interface und @end in der .m-Datei:</p>
<pre class="brush: objc; title: ; notranslate">@interface BookmarksMasterViewController ()

@property (nonatomic, strong) NSMutableArray *bookmarksArray;

@end</pre>
<p>Auch wenn die Property privat ist, müssen wir sie noch synthetisieren. Schreibe die @synthesize-Zeile unter @implementation BookmarksMasterViewController:</p>
<pre class="brush: objc; title: ; notranslate">@synthesize bookmarksArray;</pre>
<p>Hier noch einmal eine Übersicht, wie die Datei nun aussehen sollte:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-BookmarksMasterViewControllerm.png"><img class="aligncenter size-full wp-image-1485" title="iPadSplitViewTutorial - BookmarksMasterViewController.m" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorial-BookmarksMasterViewControllerm.png" alt="" width="649" height="291" /></a></p>
<p>Als nächstes füllen wir das Array mit ein paar Lesezeichen. Ändere dazu die Methode <em>viewDidLoad</em> ab:</p>
<pre class="brush: objc; title: ; notranslate">- (void)viewDidLoad
{
    [super viewDidLoad];

    self.bookmarksArray = [NSMutableArray arrayWithObjects:@&quot;http://www.iosdevgermany.de&quot;, @&quot;https://developer.apple.com&quot;,nil];
}</pre>
<p>Das sollte nichts Neues mehr sein: Wir definieren das Array mit zwei URLs.</p>
<p>Um den Table View voll funktionsfähig zu machen, müssen wir nun noch die Methode <em>numberOfSectionsInTableView: </em>, <em>tableView:numberOfRowsInSection:</em> und <em>tableView:cellForRowAtIndexPath:</em> bearbeiten:</p>
<pre class="brush: objc; title: ; notranslate">- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [self.bookmarksArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @&quot;BookmarkCell&quot;;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    cell.textLabel.text = [self.bookmarksArray objectAtIndex:indexPath.row];

    return cell;
}</pre>
<p>In den beiden ersten Methoden legen wir einfach fest, dass wir nur eine Section und so viele Zeilen wie URLs haben wollen. In der dritten Methode ändern wir den Wert des <em>CellIdentifier</em> auf &#8220;BookmarkCell&#8221;, also den Identifier den wir vorhin im Storyboard festgelegt haben. Unter &#8220;//Configure the cell&#8230;&#8221; weißen wir dem TextLabel der Cell noch die passende URL zu. Das ist alles nichts Neues, deswegen gehe ich nicht genauer darauf ein.</p>
<p>Es fehlt nur noch ein letzter Schritt zum funktionstüchtigen Split View. Und zwar haben wir zu Beginn in &#8220;ViewController.h&#8221; das UISplitViewControllerDelegate eingebunden. Dieses Delegate haben wir aber noch nicht dem Split View Controller in Storyboard zugewiesen. Leider ist es nicht möglich, dies im Storyboard zu bewerkstelligen. Deshalb tun wir das im Code und die einzige Klasse die dafür in Frage kommt ist <em>AppDelegate</em>.</p>
<p>Öffne die Datei &#8220;AppDelegate.m&#8221;. Dort befindet sich ganz oben die Methode <em>application:didFinishLaunchingWithOptions:</em> Diese tut was sie sagt: Sie wird aufgerufen, wenn die App fertig geladen ist. Das ist ein guter Zeitpunkt, um das Delegate des Split View Controllers zu setzen:</p>
<pre class="brush: objc; title: ; notranslate">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController;
    splitViewController.delegate = [splitViewController.viewControllers lastObject];

    return YES;
}</pre>
<p>Das sieht nun erstmal nach einer ziemlich ungewöhnlichen Syntax aus.</p>
<p>In der ersten Zeile erstellen wir einen <em>UISplitViewController</em> namens <em>splitViewController</em>.<br />
In der zweiten Zeile weisen wir <em>splitViewController.delegate</em> den Wert <em>[splitViewController.viewControllers lastObject]</em> zu. <em>splitViewController.viewControllers</em> ist ein Array mit allen Child View Controllern des Split View Controllers. In unserem Fall ist das der Navigation Controller, der Master View Controller und der Detail View Controller. Da sich der Detail View Controller immer an letzter Stelle befindet, erreichen wir ihn über die Methode <em>lastObject</em>. Und wenn Du dich erinnerst: Im Detail View Controller haben wir das <em>UISplitViewControllerDelegate</em> eingebunden und deshalb weißen wir diesen Wert auch dem delegate zu.</p>
<p>Bleibt nur noch die seltsame Syntax in der vorherigen Zeile zu erklären: <em>(UISplitViewController *) self.window.rootViewController</em>. Zuerst kann man sagen, dass <em>self.window.rootViewController</em> einfach der erste Controller im Storyboard ist, also der Split View Controller. Das Problem ist aber, dass <em>self.window.rootViewController</em> vom Typ <em>UIViewController*</em> ist. Die Variable die wir erstellt habe ist aber vom Typ <em>UISplitViewController*</em>. Und da kommt das <em>(UISplitViewController *)</em> ins Spiel. Das ist ein sogenannter <em>cast</em>. Als <em>cast</em> bezeichnet man eine Typumwandlung. In unserem Fall wird der Typ <em>UIViewController*</em> in den Typ <em>UISplitViewController* </em>umgewandelt.</p>
<p>Und schon ergibt das ganze Sinn.</p>
<p>Die App funktioniert nun soweit. Wenn Du sie ausführst, kannst Du über den Button &#8220;Lesezeichen&#8221; den Popover Controller, also den Master View Controller anzeigen. Man kann ihn sogar mit einer Swipe-Geste nach rechts anzeigen und verschwinden lassen. Im Landscape Mode ist der Master View Controller immer sichtbar (drehe den Simulator mit <em>cmd+Pfeiltaste</em>). Das Einzige, das noch nicht funktioniert, ist das Anzeigen der Lesezeichen.</p>
<p><strong>5. Kommunikation zwischen Master und Detail View Controller</strong></p>
<p>Damit der Detail View Controller weiß, welche Website er öffnen soll, muss ihm dies der Master View Controller sagen.</p>
<p>Wir beginnen mit der Implementierung, indem wir die Klasse <em>ViewController</em> auf die Kommunikation vorbereiten. Dazu erstellen wir zuerst eine Variable, in wir die vom Master View Controller empfangene URL speichern.</p>
<p>Öffne &#8220;ViewController.h&#8221; und füge diese Property zu den anderen hinzu:</p>
<pre class="brush: objc; title: ; notranslate">@property (strong, nonatomic) id detailItem;</pre>
<p>Da wir diese Property in der Header-Datei und nicht in der Implementierungs-Datei deklariert haben, ist sie nicht privat, sondern kann auch von außerhalb der Klasse verwendet werden.</p>
<p>Eine Besonderheit bei dieser Property ist der Typ <em>id</em>. Man verwendet diesen Typ, wenn man sich nicht sicher ist, von welchem Typ der zugewiesene Wert sein wird. Wir wissen zwar, dass wir unsere URL als <em>NSString </em>übergeben werden, aber wir halten uns damit alle Möglichkeiten offen.</p>
<p>Da zu jeder Property ein @synthesize gehört müssen wir dieses noch in &#8220;ViewController.m&#8221; einfügen:</p>
<pre class="brush: objc; title: ; notranslate">@synthesize detailItem = _detailItem;</pre>
<p>Jetzt erstellen wir noch eine Methode, mit der man von der BookmarksMasterViewController-Klasse aus dieses detailItem bearbeiten kann. Das ist ganz praktisch, da wir so nicht nur den Wert ändern, sondern noch weitere Dinge gleich im Anschluss tun können. Füge die Methode über <em>viewDidLoad</em> ein:</p>
<pre class="brush: objc; title: ; notranslate">-(void) setDetailItem:(id)newDetailItem {
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;

        [self configureView];
    }

    if (masterPopoverController != nil) {
        [masterPopoverController dismissPopoverAnimated: YES];
    }
}</pre>
<p>Es erscheint eine Fehlermeldung, um die wir uns in Kürze kümmern werden.</p>
<p><span style="text-decoration: underline;">Zeile 2:</span> Hier prüfen wir, ob das alte detailItem gleich dem neuen detailItem ist. Wenn die beiden gleich sind, müssen wir gar keine Änderung vornehmen, da ja schon die passende Website angezeigt wird.<br />
<span style="text-decoration: underline;">Zeile 3:</span> Wenn die beiden items nicht gleich sind holen wir das einfach nach, indem wir newDetailItem dem detailItem zuweisen.<br />
<span style="text-decoration: underline;">Zeile 5:</span> Diese Zeile verursacht die Fehlermeldung. Ganz einfach deswegen, weil es noch keine Methode namens <em>configureView</em> in unserer Klasse gibt. Das werden gleich ändern. Aber vorweg erwähnt: In dieser Methode lassen wir den Web View die besagte Website anzeigen.<br />
<span style="text-decoration: underline;">Zeile 8:</span> Du kannst dich vielleicht noch an die Methode<br />
splitViewController:willShowViewController:invalidatingBarButtonItem: erinnern, die wir weiter oben im Tutorial definiert haben. Scrolle eventuell noch mal zu ihr runter, sie befindet sich auch in &#8220;ViewController.m&#8221;. In dieser Methode haben wir am Ende den <em>masterPopoverController</em> auf <em>nil </em>gesetzt. Das bedeutet, wenn das iPad im Landscape Mode ist, ist <em>masterPopoverController nil. </em>In der Methode <em>setDetailItem: </em>überprüfen wir mit<em> if (masterPopoverController != nil) </em>also, ob das iPad sich gerade im Landscape Mode oder im Portrait Mode befindet.<br />
<span style="text-decoration: underline;">Zeile 9:</span> Wenn sich das iPad gerade im Portrait Mode befindet, soll der Master View wieder versteckt werden, wenn ein Lesezeichen ausgewählt wurde. Wenn sich das iPad im Landscape Mode befindet, also <em>masterPopoverController != nil </em>nicht zutrifft, können wir den masterPopoverController nicht verstecken, da er in diesem Mode immer angezeigt wird.</p>
<p>Jetzt kommen wir zur besagten Methode <em>configureView</em>. Da wir diese Methode nur innerhalb der Klasse verwenden werden, deklarieren wir sie zwischen @interface und @end in &#8220;ViewController.<strong>m</strong>&#8220;:</p>
<pre class="brush: objc; title: ; notranslate">@interface ViewController ()
-(void) configureView;

@end</pre>
<p>Füge die Methode dann unter der Methode <em>setDetailItem:</em> ein:</p>
<pre class="brush: objc; title: ; notranslate">-(void) configureView {
    NSString *URLString = [self.detailItem description];
    NSURL *websiteURL = [NSURL URLWithString:URLString];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:websiteURL];
    [self.webView loadRequest:requestObj];
}</pre>
<p><span style="text-decoration: underline;">Zeile 2:</span> In dieser Zeile erstellen wir einen NSString* und speichern den Wert des <em>detailItem</em>s in ihm ab. Um an den NSString*-Value einer id-Variable zu kommen, verwendet man die Methode <em>description</em>.<br />
<span style="text-decoration: underline;">Zeile 3-5:</span> In diesen Zeilen erstellen wir eine URL, mit dieser dann eine Request und lassen den Web View die Request dann laden.</p>
<p>Es fehlt nur noch ein letzter Schritt, bis die App fertig ist.<br />
Öffne &#8220;BookmarksMasterViewController.<strong>m</strong>&#8221; und füge folgende Zeile unter <em>#import &#8220;BookmarksMasterViewController.h </em>ein:</p>
<pre class="brush: objc; title: ; notranslate">#import &quot;ViewController.h&quot;</pre>
<p>Scrolle dann ans Ende der Datei und bearbeite die Methode <em>tableView:didSelectRowAtIndexPath:</em></p>
<pre class="brush: objc; title: ; notranslate">- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *object = [self.bookmarksArray objectAtIndex:indexPath.row];
    ViewController *detailViewController = (ViewController *)[self.splitViewController.viewControllers lastObject];
    [detailViewController setDetailItem:object];
}</pre>
<p>Diese Methode wird aufgerufen, wenn eine Zeile im Table View ausgewählt wird. Wir holen uns die passende URL aus dem <em>bookmarksArray</em> und speichern sie in einem NSString*. Dann erstellen wir eine Instanz der Klasse <em>ViewController,</em> also der Klasse des <em>DetailViewControllers. </em>Auch hier <em>casten </em>wir das letzte Objekt von <em>self.splitViewController.viewControllers, </em>aus dem gleichen Grund, wie im App Delegate. Zum Schluss rufen wir noch die vorhin erstellte Methode <em>setDetailItem:</em> auf und übergeben ihr die URL, die in <em>object</em> gespeichert ist.</p>
<p>Die App ist damit fertig. Starte sie und wähle im Master View einfach mal ein Lesezeichen aus. Wundere dich nicht, wenn zuerst nichts passiert, denn der Web View braucht seine Zeit, um die Website zu laden.</p>
<p><strong>6. Schluss</strong></p>
<p>Das Xcode-Projekt kannst Du dir hier downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/SplitViewTutorial.zip">Split View Tutorial</a></p>
<p>Bei Fragen oder Kritik kannst Du mir gerne ein Kommentar hinterlassen.</p>
<p>Um keine Tutorial mehr zu verpassen, abonniere einfach den <a href="http://www.iosdevgermany.de/feed">Blog RSS</a> oder folge mir auf <a href="https://twitter.com/#!/iOsDevGermany">Twitter</a>.</p>
<div class="shr-publisher-1423"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/dISKGDZGAOo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/ipad-tutorial-deutsch-split-view-controller/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://www.iosdevgermany.de/wp-content/uploads/2012/04/iPadSplitViewTutorialVideo.m4v" length="4189050" type="video/mp4" />
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/ipad-tutorial-deutsch-split-view-controller/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ipad-tutorial-deutsch-split-view-controller</feedburner:origLink></item>
		<item>
		<title>Gestures Tutorial deutsch – Swipe, Pan, und Pinch Geste</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/dNq_edyeuVI/</link>
		<comments>http://www.iosdevgermany.de/tutorial/gestures-tutorial-deutsch-swipe-pan-und-pinch-geste/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 12:04:40 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Gesten]]></category>
		<category><![CDATA[Gestures Recognizer]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Pan Geste]]></category>
		<category><![CDATA[Pinch Geste]]></category>
		<category><![CDATA[Segues]]></category>
		<category><![CDATA[Skalieren]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[Swipe Geste]]></category>
		<category><![CDATA[UIImageView]]></category>
		<category><![CDATA[Xcode 4.3]]></category>
		<category><![CDATA[Zoomen]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=1333</guid>
		<description><![CDATA[Einleitung Mit iOS 5 ist es viel einfacher geworden, Gesten in der eigenen App zu erkennen und auf diese zu reagieren. Und das ohne viel Code schreiben zu müssen. In diesem Tutorial zeige ich, wie man die wichtigsten Gesten implementiert. &#8230; <a href="http://www.iosdevgermany.de/tutorial/gestures-tutorial-deutsch-swipe-pan-und-pinch-geste/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><strong>Einleitung</strong></p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Artikelbild.png"><img class="alignleft  wp-image-1408" title="Gestures Tutorial - Artikelbild" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Artikelbild.png" alt="" width="255" height="255" /></a>Mit iOS 5 ist es viel einfacher geworden, Gesten in der eigenen App zu erkennen und auf diese zu reagieren. Und das ohne viel Code schreiben zu müssen. In diesem Tutorial zeige ich, wie man die wichtigsten Gesten implementiert. Dabei werden wir zum Beispiel einen neuen View Controller per Wischgeste aufrufen,  mit der Pinch-Geste ein Bild skalieren und dieses mit dem Finger per Pan-Geste in der App umherziehen.</p>
<p>Hier nochmal die Übersicht, was Du in diesem Tutorial lernst:</p>
<ul>
<li>Implementieren eines Swipe, Pan und Pinch Gesture Recognizers</li>
<li>Ein Bild skalieren</li>
<li>Objekte in der App mit dem Finger bewegen</li>
<li>Wechseln zwischen Views mit einer Wischgeste</li>
</ul>
<div><span style="font-size: small;"><span class="Apple-style-span" style="line-height: 24px;"><span id="more-1333"></span></span></span></div>
<p><em>Diese Tutorial wurde für iOS 5 und Xcode Version 4.2 oder neuer (4.3) geschrieben.</em></p>
<p><strong>1. Die App</strong></p>
<p>Beim Start der App wird ein View angezeigt, in dem er User aufgefordert wird, zum nächsten View zu wechseln, indem er mit dem Finger nach links wischt. In diesem befindet sich dann ein Bild, das man verschieben und vergrößern kann.</p>
<p>Hier mal eine Bildschrimaufnahme der App:<br />
<a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial.mov">Gestures Tutorial</a></p>
<p><strong>2. Die Swipe-Geste</strong></p>
<p>Wir fangen mit der einfachsten Geste an, der Swipe-Geste.</p>
<p>Erstelle ein neues Xcode-Projekt mit dem <em>Single View Application-</em>Template. Bei <em>Product Name </em>kannst Du beispielsweise &#8220;GesturesTutorial&#8221; eingeben. Die restlichen Einstellungen sollten so wie immer sein:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Project_Settings.png"><img class="aligncenter size-full wp-image-1337" title="Gestures Tutorial - Project Settings" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Project_Settings.png" alt="" width="731" height="494" /></a></p>
<p>Klicke auf Next und speichere das Projekt ab.</p>
<p>Öffne dann &#8220;MainStoryboard.storyboard&#8221;. Zuerst erstellen wir wieder das Interface der App.</p>
<p>Wir beginnen damit, einen Navigation Controller einzufügen, damit der Benutzer leichter durch die App navigieren kann. Wähle dazu den View Controller aus, indem Du auf das schwarze Dock unter ihm klickst und gehe in der Menüleiste von Xcode zu <em>Editor-&gt;Embed In-&gt;Navigation Controller</em>. Damit die Navigation Bar nicht so leer ist, klicken wir sie <strong>im View Controller</strong> doppelt an und geben einfach &#8220;Start&#8221; ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Navigation_Bar.png"><img class="aligncenter size-full wp-image-1339" title="Gestures Tutorial - Navigation Bar" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Navigation_Bar.png" alt="" width="714" height="756" /></a></p>
<p>Der View Controller ziemlich leer bleiben und den User nur darauf hinweisen, dass er mit einer Wischgeste zum nächsten View kommt.</p>
<p>Suche in der Library nach einem Label und ziehe es an den oberen Rand des Views. Weise ihm den Text &#8220;Wische nach links, um zu beginnen&#8221; zu und richte das Label mittig aus.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Der_erste_View_Controller.png"><img class="aligncenter size-full wp-image-1340" title="Gestures Tutorial- Der erste View Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Der_erste_View_Controller.png" alt="" width="355" height="573" /></a></p>
<p>Jetzt implementieren wir auch gleich die erste Geste. Dazu benötigen wir einen sogenannten <em>Gestures Recognizer, </em>genauer gesagt den <em>Swipe Gestures Recognizer.</em> Dieses Object erkennt, wenn in einem View eine Swipe- bzw. Wischgeste durchgeführt wird. Wie jedes Object finden wir ihn in der Library. Ziehe ihn von dort in das schwarze Dock des View Controllers.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Swipe_Gesture_Recognizer.png"><img class="aligncenter size-full wp-image-1341" title="Gestures Tutorial - Swipe Gesture Recognizer" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Swipe_Gesture_Recognizer.png" alt="" width="668" height="697" /></a></p>
<p>Jetzt befindet er sich erstmal im View Controller. Zunächst müssen wir dem Recognizer aber noch mitteilen, wo die besagte Geste durchgeführt werden wird. In unserem Fall wird das auf dem View der Fall sein. Lasse Dir deshalb im Document Outline den View innerhalb des View Controllers anzeigen und ziehe dann die Swipe-Geste auf diesen View.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Recognizer_auf_View.png"><img class="aligncenter size-full wp-image-1345" title="Gestures Tutorial - Recognizer auf View" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Recognizer_auf_View.png" alt="" width="203" height="198" /></a></p>
<p>Jetzt kann über allem auf dem View, also dem weißen Bereich des Windows, die Geste erkannt werden. Mit welchem Object der Gesture Recognizer verbunden ist, sieht man übrigens im Connections inspector. Wähle den Swipe Gesture Recognizer einmal aus und öffne den Connections inspector. Unter <em>Referencing Outlet Collections</em> ist eine Verknüpfung zwischen <em>gestureRecognizers</em> und <em>View.</em></p>
<p>Sehen wir uns nun den Recognizer mal im <em>Attributes inspector</em> genauer an. Es stehen uns einige wenige Attribute zur Verfügung, von denen uns vorallem die ersten beiden interessieren,<em> Swipe</em> und <em>Touches</em>. Mit Swipe wird festgelegt, in welche Richtung gewischt werden muss, damit die Geste erkannt wird. Wie mit dem Label angegeben, ist das in unserem Fall &#8220;Left&#8221;. Mit Touches geben wir an, mit wie vielen Fingern die Geste durchgeführt werden soll. Da uns im iOS-Simulator nur ein &#8220;Finger&#8221; zur Verfügung steht, belassen wir es beim Wert 1.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Swipe_Gesture_Attributes_Swipe_Touches.png"><img class="aligncenter size-full wp-image-1342" title="Gestures Tutorial - Swipe-Gesture Attribute Swipe Touches" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Swipe_Gesture_Attributes_Swipe_Touches.png" alt="" width="261" height="219" /></a></p>
<p>Nun müssen wir noch festlegen, was passiert, wenn die Geste erkannt wird. Das ist bei der Wischgeste besonders einfach, da wir keine einzige Zeile Code schreiben müssen.  Wir wollen ja nur, dass ein neuer View erscheint:</p>
<p>Ziehe also einen <em>View Controller</em> aus der Library neben den ersten View Controller. Wähle dann wieder den ersten View Controller aus und klicke mit gedrückter ctrl-Taste auf den <em>Swipe Gesture Recognizer</em> im Dock, ziehe den blauen Faden auf den zweiten View Controller und wähle dann &#8220;Push&#8221;.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Gesture_und_View_Controller_verbinden.png"><img class="aligncenter size-full wp-image-1344" title="Gestures Tutorial - Gesture und View Controller verbinden" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Gesture_und_View_Controller_verbinden.png" alt="" width="796" height="610" /></a></p>
<p>Was auffällt ist, dass im neuen View Controller im Storyboard-Editor keine Navigation Bar angezeigt wird. Das könnte später bei der Platzierung von Objects zu Problemen führen. Wähle deshalb den View Controller aus und öffne den Attributes inspector. Stelle bei <em>Top Bar</em> den Wert &#8220;Navigation Bar&#8221; ein, bei <em>Status Bar</em> &#8221;Grey&#8221; und bei <em>Orientation</em> &#8221;Portrait&#8221;.<br />
Dabei ändern wir nichts an der App selbst, sondern simulieren lediglich die Navigation und Status Bar <strong>im Storyboard-Editor</strong>, damit wir die Objects später korrekt und ohne Verzerrung einfügen können. Außerdem legen wir mit <em>Orientation </em>&#8220;Portrait&#8221; fest, dass der View hochkant benutzt wird.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Simulated_Metrics.png"><img class="aligncenter size-full wp-image-1356" title="Gestures Tutorial - Simulated Metrics" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Simulated_Metrics.png" alt="" width="262" height="400" /></a></p>
<p>Das wars auch schon mit der ersten Geste. Um das ganze zu testen, führen wie die App einmal aus.</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Die_Swipe_Geste_in_Aktion.png"><img class="aligncenter  wp-image-1347" title="Gestures Tutorial - Die Swipe Geste in Aktion" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Die_Swipe_Geste_in_Aktion.png" alt="" width="251" height="498" /></a></p>
<p style="text-align: left;">Sehr hübsch, dass der View nach links eingeschoben wird, also in die gleiche Richtung, in die die Geste führt.</p>
<p style="text-align: left;"><strong>3. Der schwarze Kreis</strong></p>
<p style="text-align: left;">Bevor wir mit den zwei anderen Gesten weitermachen, müssen wir noch ein wenig Vorarbeit leisten. Wir fügen also zuerst mal das Bild ein.</p>
<p style="text-align: left;">Du kannst Dir dieses hier downloaden oder auch ein schöneres benutzen <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p><img class="aligncenter size-full wp-image-1349" title="Schwarzer Kreis" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/SchwarzerKreis.png" alt="" width="97" height="92" /></p>
<p>Sobald Du den schwarzen Kreis gedownloaded hast, erscheint er in deinem Download-Folder. Von da ziehst Du ihn dann einfach in den Projektordner in Xcode. Achte darauf, dass im erscheinenden Fenster der Haken bei <em>Copy items into destination group&#8217;s folder (if needed)</em> gesetzt ist.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Bild_importieren.png"><img class="aligncenter size-large wp-image-1352" title="Gestures Tutorial - Bild importieren" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Bild_importieren-1024x644.png" alt="" width="640" height="402" /></a></p>
<p>Öffne als nächstes &#8220;MainStoryboard.storyboard&#8221; und ziehe einen Image View aus der Library in die Mitte des zweiten View Controllers. Öffne dann den Attributes inspector und gib bei <em>Image</em> den Namen des Bildes, also &#8220;SchwarzerKreis.png&#8221; ein.</p>
<p>Wir bleiben gleich im Attributes inspector, denn wir müssen noch eine Einstellung vornehmen. Der Image View wird später auf die Gesten des Benutzers reagieren müssen. Damit er das kann müssen wir den Haken bei <em>User Interaction Enabled</em> setzen. Diese Einstellung darf man nicht vergessen, da sonst die Gesten mit dem Kreis nicht funktionieren.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Image_View_im_Attributes_inspector.png"><img class="aligncenter size-full wp-image-1374" title="Gestures Tutorial - Image View im Attributes inspector- User Interaction Enabled" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Image_View_im_Attributes_inspector.png" alt="" width="261" height="485" /></a></p>
<p>Öffne dann den Size inspector und gib für die Breite (Width) 125 und für die Höhe (Height) 125 ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Der_schwarze_Kreis.png"><img class="aligncenter size-full wp-image-1354" title="Gestures Tutorial - Der schwarze Kreis" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Der_schwarze_Kreis.png" alt="" width="667" height="777" /></a></p>
<p>Jetzt, da der Kreis eingefügt ist, können wir die App nochmal startet. Im neuen View sollte nun das Bild angezeigt werden.</p>
<p>Nun müssen wir noch die .m- und die .h-Datei für den neuen View Controller erstellen, da wir dort später den Gesten eine Funktion zuweisen werden.</p>
<p>Dazu klickst Du mit der rechten Maustaste auf den Projekt-Ordner und wählst <em>New File&#8230; </em>Wähle dann in der Kategorie <em>Cocoa Touch</em> das Template <em>Objective-C class</em>. Gib bei <em>Class</em> &#8221;CircleViewController&#8221; ein und stelle bei <em>Subclass of</em> den Wert &#8220;UIView Controller&#8221; ein. Eventuell musst Du dazu die Liste durchscrollen.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-View_Controller_Dateien_erstellen.png"><img class="aligncenter size-full wp-image-1358" title="Gestures Tutorial - View Controller Dateien erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-View_Controller_Dateien_erstellen.png" alt="" width="729" height="494" /></a></p>
<p>Ansonsten sollte kein Häkchen gesetzt sein. Klicke auf <em>Next</em> und speichere die Dateien ab.</p>
<p>Jetzt müssen wir diese Dateien nur noch dem View Controller im Storyboard zuweisen. Öffne also &#8220;MainStoryboard.storyboard&#8221;, wähle den rechten View Controller aus und öffne den <em>Identity inspector</em>. Gib bei Class &#8220;CircleViewController&#8221; ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Dateien_View_Controller_zuweisen.png"><img class="aligncenter size-full wp-image-1360" title="Gestures Tutorial - Dateien View Controller zuweisen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Dateien_View_Controller_zuweisen.png" alt="" width="259" height="488" /></a></p>
<p>Da wir ja später mit dem Image View arbeiten werden, müssen wir nun noch das Outlet für ihn erstellen. Wähle ihn dazu aus und schalte auf <em>Assistant Editor</em> um (Mittlere Button bei Editor in der Toolbar von Xcode). Ctrl-Klicke den Kreis an und ziehe den blauen Faden unter @interface&#8230; in &#8220;CircleViewController.h&#8221;. Nenne das Outlet &#8220;blackCircle&#8221; und klicke auf <em>Connect</em>.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Outlet_erstellen1.png"><img class="aligncenter size-large wp-image-1364" title="Gestures Tutorial - Outlet erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Outlet_erstellen1-1024x644.png" alt="" width="640" height="402" /></a></p>
<p>Schalte nun wieder auf <em>Standard Editor</em> um und öffne &#8220;MainStoryboard.storyboard&#8221;.</p>
<p>Um sicherzugehen, dass sich nichts verändert hat, führen wir die App erneut aus. Es sollte also noch korrekt sein.</p>
<p><strong>4. Die Pan Geste</strong></p>
<p>Nun zur zweiten Geste, der Pan Geste. Mit dieser Geste soll der Benutzer den Kreis im View herumziehen können.</p>
<p>Suche also zuerst den <em>Pan Gesture Recognizer</em> in der Library und ziehe ihn in das Dock des &#8220;CircleViewController&#8221;. Wie bei der Swipe Geste müssen wir dem Recognizer wieder mitteilen, wo die Gesten durchgeführt werden. Diesmal ziehen wir den Pan Gesture Recognizer im Document Outline aber auf den Image View, da der Benutzer ja den Kreis, also das Bild, selbst antippen und umherziehen wird.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Pan_Gesture_Recognizer_auf_Image_View.png"><img class="aligncenter size-full wp-image-1368" title="Gestures Tutoria l - Pan Gesture Recognizer auf Image View" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Pan_Gesture_Recognizer_auf_Image_View.png" alt="" width="198" height="164" /></a></p>
<p>Bei der Pan Gesture werden wir leider nicht ohne eine Zeile Code auskommen. Wir müssen nämlich nun eine Action erstellen, die aufgerufen wird, wenn der Recognizer die Geste erkannt hat. In dieser Action werden wir dem Kreis die neue Position zuweisen, sodass er eben dem Finger des Users folgt.</p>
<p>Wähle den Pan Gesture Recognizer aus und öffne den Connections inspector. Unter <em>Sent Actions</em> befindet sich das Element <em>selector</em>. Die mit dem selector verbundene Methode ist genau die besprochene Action. Um diese zu erstellen, werden wir wieder in den Assistant Editor wechseln. Ziehe dann den blauen Faden von <em>selector</em> unter das Outlet des Image Views in &#8220;CircleViewController.h&#8221;. Ganz wichtig ist, dass Du bei <em>Type</em> den Wert &#8220;UIPanGestureRecognizer&#8221; einstellst. Dadurch wir eine speziell für die Pan Geste gedachte Action erstellt. Bei <em>Name</em> gib einfach &#8220;handlePan&#8221; ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-handlePan_erstellen1.png"><img class="aligncenter size-large wp-image-1371" title="Gestures Tutorial - handlePan erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-handlePan_erstellen1-1024x644.png" alt="" width="640" height="402" /></a></p>
<p>Zunächst müssen wir die Action noch definieren. Schalte wieder auf Standard Editor um und öffne &#8220;CircleViewController.m&#8221;. Am Ende der Datei befindet sich schon die leere Methode handlePan. Ändere sie wie folgt ab:</p>
<pre class="brush: objc; title: ; notranslate">- (IBAction)handlePan:(UIPanGestureRecognizer *)sender {
    CGPoint translation = [sender translationInView:self.view];
    sender.view.center = CGPointMake(sender.view.center.x + translation.x, sender.view.center.y + translation.y);
    [sender setTranslation:CGPointMake(0, 0) inView:self.view];
}</pre>
<p>Gehen wir die Methode mal durch:<br />
<span style="text-decoration: underline;">Zeile 2:</span> Ein CGPoint ist einfach eine Koordinate auf dem Display. Wir deklarieren und definieren die Variable und erhalten mit [sender TranslationInView: self.view] die Bewegung, die der Finger des Benutzer vollführt. Mit <em>TranslationInView: self.view</em> legen wir fest, dass sich die Bewegung auf den View unseres View Controllers bezieht. Das bedeutet die Variable <em>CGPoint translation </em>ist der Abstand zweier Punkte in dem im Bild gezeigten Koordinatensystem:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Koordinatensytem_View2.png"><img class="aligncenter size-full wp-image-1381" title="Gestures Tutorial - Koordinatensytem View" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Koordinatensytem_View2.png" alt="" width="363" height="517" /></a></p>
<p>Bewegt der Benutzer seinen Finger also nach rechts ergeben sich zwei Punkte P(0/0) und Q(10/0). Damit ergibt sich für <em>translation </em>ein Wert von (10/0), da die x-Bewegung 10 und die y-Bewegung 0 ist.<br />
Da sieht man auch gleich, wie wichtig es ist, dass wir im Storyboard die Navigation Bar <em>simuliert</em> haben. Das Koordinatensystem des Views bezieht sich nämlich nur auf den View und nicht auf die Navigation Bar. Hätten wir keine Navigation Bar ginge das Koordinatensystem von x:0-320 und y:0-460.<br />
Auch wichtig zu erwähnen ist, dass bei der Position eines Objects immer von dessen Mittelpunkt ausgegangen wird. Der schwarze Kreis im Bild befindet sich deshalb bei (0/0).<br />
<span style="text-decoration: underline;">Zeile 3:</span> Jetzt setzen wir die Position des Kreises neu. Da wir vorhin im Storyboard den Gesture Recognizer auf den Image View gezogen haben, haben wir festgelegt, dass sich die Geste auf den Image View bezieht. Das bedeutet, dass <em>sender.view</em> uns eben diesen Image View liefert.  <em>Sender.view.center</em> liefert dann einfach die Position des Image Views, also des Kreises. Zu dieser Position rechnen wir dann die Bewegung dazu. Wenn wir bei dem oberen Beispiel bleiben, wäre die Position des Kreises dann M(0+10/0+0), also M(10/0). Eigentlich ganz einfach <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .<br />
<span style="text-decoration: underline;">Zeile 4:</span> Hier setzen wir die translation, also die Positionsänderung wieder auf 0, denn sonst würde diese nach mehrere Pan-Gesten riesig groß werden und der Kreis würde sich viel zu schnell bewegen.</p>
<p>Das war&#8217;s auch schon mit der Pan-Geste. Führe die App nun erneut aus, um zu sehen ob man den Kreis nun bewegen kann.</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Kreis_bewegen.png"><img class="aligncenter  wp-image-1383" title="Gestures Tutorial - Kreis bewegen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-Kreis_bewegen.png" alt="" width="277" height="521" /></a></p>
<p style="text-align: left;">Und tatsächlich können wir den Kreis im View umherziehen. An dieser Stelle erwähne ich nochmal, dass das nur funktioniert, weil wir im Storyboard beim Image View ein Häkchen bei <em>User Interaction Enabled</em> gesetzt haben. Ansonsten würde der Kreis sich nämlich nicht von der Stelle rühren.</p>
<p style="text-align: left;"><strong>5. Die Pinch Geste &#8211; Skalieren</strong></p>
<p style="text-align: left;">Kommen wir zur letzten Geste, der Pinch Geste. Wenn diese erkannt wird, soll an den Kreis herangezoomt werden, bzw. der Kreis einfach vergrößert werden.</p>
<p style="text-align: left;">Zu Beginn gehen wir ähnlich vor, wie bei der Pan Geste. Ziehe zuerst den <em>Pinch Gesture Recognizer </em>in das Dock des View Controllers. Jetzt müssen wir wieder festlegen, auf welches Object sich der Recognizer bezieht. In diesem Fall soll das nicht der Image View sein, sondern der ganze View, da somit das Skalieren leichter fällt, da man die Finger nicht zwingen auf dem schwarzen Kreis haben muss. Ziehe also im Document Outline den Recognizer auf den View. Das war auch schon der erste Teil.</p>
<p style="text-align: left;">Als nächstes erstellen wir die Action für die Pinch Geste. Lass dir also den Recognizer im Connections inspector anzeigen und schalte wieder auf Assistant Editor um. Ziehe dann den blauen Faden vom Kreis hinter selector unter die andere Action. In der erscheinenden Sprechblase gibst Du bei Name &#8220;handlePinch&#8221; ein und stellst den Wert bei Type auf &#8220;UIPinchGestureRecognizer&#8221;.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-handlePinch_erstellen.png"><img class="aligncenter size-large wp-image-1387" title="Gestures Tutorial - handlePinch erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial-handlePinch_erstellen-1024x644.png" alt="" width="640" height="402" /></a></p>
<p style="text-align: left;">Öffne nun &#8220;CircleViewController.m&#8221; und ändere die Methode <em>handlePinch:</em> ab:</p>
<pre class="brush: objc; title: ; notranslate">- (IBAction)handlePinch:(UIPinchGestureRecognizer *)sender {
    CGFloat newScale = sender.scale;
    CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
    self.blackCircle.transform = transform;
}</pre>
<p>Die Methode handlePinch: wird immer aufgerufen, wenn der Recognizer eine Pinch Geste erkennt. Damit das Skalieren aber nicht abgehakt ist, ist dies mehrmals pro Pinch der Fall. Das bedeutet, wenn die Geste einmal durchgeführt wird, wird die Methode ca. 20-30 mal aufgerufen und der Kreis skaliert.</p>
<p>Innerhalb der Methode wird einfach das Ausmaß des Scales ermittelt und dann eine Scale-Transformation erstellt. Diese wird dann auf den Kreis angewendet, was bewirkt, dass dieser größer wird.</p>
<p>Führe die App nun einmal aus. Du kannst das Skalieren im iOS-Simulator testen, indem Du die alt-Taste gedrückt hältst. Wie Du siehst funktioniert das Skalieren schon recht gut. Wenn Du nun allerdings versuchst ein zweites Mal zu skalieren, schrumpft der Kreis zuerst wieder auf seine Anfangsgröße, bevor er wieder skaliert wird. Das ist natürlich unschön und deshalb werden wir das jetzt beheben.</p>
<p>Dafür benötigen wir eine neue Membervariable namens initialScale vom Typ float (Kommazahl). Zur näheren Erläuterung dieser Variable komme ich gleich. So sollte &#8220;CircleViewController.h&#8221; dann aussehen:</p>
<pre class="brush: objc; title: ; notranslate">#import

@interface CircleViewController : UIViewController {
    float initialScale;
}
@property float initialScale;
@property (weak, nonatomic) IBOutlet UIImageView *blackCircle;

- (IBAction)handlePan:(UIPanGestureRecognizer *)sender;
- (IBAction)handlePinch:(UIPinchGestureRecognizer *)sender;

@end</pre>
<p>Hier ist einfach die Membervariablen zwischen den geschweiften Klammern sowie die dazugehörige property hinzugekommen.</p>
<p>Öffne dann wieder &#8220;CircleViewController.m&#8221; und füge die @synthesize-Zeile für initialScale zur anderen hinzu:</p>
<pre class="brush: objc; title: ; notranslate">@synthesize initialScale = _initialScale;</pre>
<p>Ändere nun <em>handlePinch:</em> ab:</p>
<pre class="brush: objc; title: ; notranslate">- (IBAction)handlePinch:(UIPinchGestureRecognizer *)sender {

    if (sender.state == UIGestureRecognizerStateBegan) {
        self.initialScale = blackCircle.transform.a;
    }
    else {
        CGFloat newScale = self.initialScale * sender.scale;
        CGAffineTransform transform = CGAffineTransformMakeScale(newScale,newScale);
        self.blackCircle.transform = transform;
    }
}</pre>
<p>Hinzugekommen ist ein if-else-Statement.</p>
<p><span style="text-decoration: underline;">Zeile 3:</span> Die Bedingung in dieser Zeile wird immer dann erfüllt, wenn die Finger des Benutzers das Display berühren und die Pinch Geste erkannt wird, also immer wenn er gerade <em>beginnt</em> zu skalieren.<br />
<span style="text-decoration: underline;">Zeile 4:</span> Wenn die Bedingung aus Zeile 3 erfüllt wird, wird der Membervariable, die wir vorhin erstellt haben, der Wert <em>self.blackCircle.transform.a</em> zugewiesen. Damit erhält <em>initialScale</em> als Wert das Ausmaß des bisherigen Scales. Zoomt der Benutzer also das erstmal an den Kreis heran, so ist initialScale gleich null. Beim zweiten Mal Skalieren ist initialScale dann so groß, wie nach dem ersten Scale, beim dritten Mal so groß wie nach dem zweiten Mal und so weiter. Das bewirkt, dass der Kreis beim erneuten Skalieren nicht mehr zurückspringt.<br />
Der restliche Code wurde bis auf <span style="text-decoration: underline;">Zeile 7</span> einfach von der ersten Version der Methode übernommen. Dort wird einfach der initialScale in newScale mit einberechnet.</p>
<p>Wenn du die App nun ausführst, funktioniert das Skalieren einwandfrei.</p>
<p><strong>6. Schluss</strong></p>
<p>Das Xcode-Projekt gibt&#8217;s wie immer zum Downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial2.zip">Gestures Tutorial</a></p>
<p>Wenn ihr mir Feedback zum Tutorial geben oder ein Tutorial vorschlagen wollt, schreibt einfach ein Kommentar oder gebt mir über das <a title="Kontakt" href="http://www.iosdevgermany.de/kontakt/">Kontakt-Formular</a> Bescheid.</p>
<p>Wenn Du immer über neue Tutorial informiert werden willst, kannst Du den <a href="http://www.iosdevgermany.de/feed">Blog RSS</a> abonnieren oder mir auf <a href="https://twitter.com/#!/iOsDevGermany">Twitter</a> folgen.</p>
<div class="shr-publisher-1333"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/dNq_edyeuVI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/gestures-tutorial-deutsch-swipe-pan-und-pinch-geste/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.iosdevgermany.de/wp-content/uploads/2012/04/GesturesTutorial.mov" length="707739" type="video/quicktime" />
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/gestures-tutorial-deutsch-swipe-pan-und-pinch-geste/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=gestures-tutorial-deutsch-swipe-pan-und-pinch-geste</feedburner:origLink></item>
		<item>
		<title>UIWebView Tutorial deutsch – Websites anzeigen</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/fSsw4iqm2dw/</link>
		<comments>http://www.iosdevgermany.de/tutorial/uiwebview-tutorial-deutsch-websites-anzeigen/#comments</comments>
		<pubDate>Sun, 18 Mar 2012 14:25:28 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Activity Indicator View]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Segues]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[Web View]]></category>
		<category><![CDATA[Website]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=1281</guid>
		<description><![CDATA[Einleitung In diesem Tutorial geht es um den UIWebView. Mit Hilfe dieses Objects ist es möglich, Websites innerhalb der eigenen App anzuzeigen. Außerdem behandle ich noch das Object Activity Indicator View, das man benutzen kann, um anzuzeigen, dass eine App gerade &#8230; <a href="http://www.iosdevgermany.de/tutorial/uiwebview-tutorial-deutsch-websites-anzeigen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><strong>Einleitung</strong></p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Artikelbild.png"><img class="alignleft  wp-image-1322" title="Web View Tutorial - Artikelbild" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Artikelbild.png" alt="" width="280" height="263" /></a>In diesem Tutorial geht es um den UIWebView. Mit Hilfe dieses Objects ist es möglich, Websites innerhalb der eigenen App anzuzeigen. Außerdem behandle ich noch das Object <em>Activity Indicator View,</em> das man benutzen kann, um anzuzeigen, dass eine App gerade Daten lädt. Wir werden ihn verwenden, um den User darauf hinzuweisen, dass die Website geladen wird.</p>
<p>Was Du in diesem Tutorial lernst:</p>
<ul>
<li>Implementieren eines Web Views und Anzeigen einer Website</li>
<li>Implementieren eines Activity Indicator Views</li>
</ul>
<p><span id="more-1281"></span></p>
<p><em>Diese Tutorial wurde für iOS 5 und Xcode Version 4.2 oder neuer (4.3) geschrieben.</em></p>
<p>Falls Du noch neu in der iOS Entwicklung bist, solltest Du vorher dieses Tutorial zum Einstieg lesen: <a title="Einsteiger Tutorial deutsch – Eine eigene App entwickeln" href="http://www.iosdevgermany.de/tutorial/einsteiger-tutorial-deutsch-eine-eigene-app-entwickeln/">Einsteiger Tutorial deutsch</a>.<br />
Außerdem solltest dich schon mit dem Storyboard auskennen: Storyboard Tutorial <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 1 – Grundlagen" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen/">Part 1</a>, <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 2 – Table View" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/">Part 2</a>, <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 3 – Detail View und Tab Bar Controller" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-3-detail-view-und-tab-bar-controller/">Part 3</a>.</p>
<p><strong>1. Die App</strong></p>
<p>Der User kann die URL einer Website eingeben  und diese dann auf Knopfdruck in einem neue View anzeigen lassen. Selbstverständlich kann man sich dann frei auf der Website bewegen.</p>
<p><strong>2. Das Interface</strong></p>
<p>Öffne Xcode und erstelle ein neues Projekt. Wir benutzen für dieses Tutorial das <em>Single View Application</em>-Template. Nenne das Projekt beispielsweise &#8220;UIWebViewTutorial&#8221; und stelle folgende Projekt-Optionen ein:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Project_Settings.png"><img class="alignleft size-full wp-image-1284" title="Web View Tutorial deutsch - Projekt-Optionen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Project_Settings.png" alt="" width="731" height="494" /></a></p>
<p>Klicke auf Next und speichere das Projekt ab.</p>
<p>Wir beginnen wie immer im Storyboard. Öffne die Datei &#8220;MainStoryboard.storyboard&#8221;.</p>
<p>Zuerst fügen wir zum View Controller einen Navigation Controller hinzu, um die Navigation zu vereinfachen. Wähle dazu den &#8220;View Controller&#8221; aus, indem du auf das schwarze Dock unter ihm klickst und wähle dann in der Menüleiste von Xcode <em>Editor-&gt;Embed In-&gt;Navigation Controller</em>. Der Navigation Controller erscheint damit im Editor-Bereich und der &#8220;View Controller&#8221; besitzt nun eine Navigation Bar.</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-NavigationController.png"><img class="size-medium wp-image-1286 aligncenter" title="Web View Tutorial - Navigation Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-NavigationController-300x203.png" alt="" width="300" height="203" /></a></p>
<p style="text-align: left;">Wir ändern gleich mal den Titel der Navigation Bar von &#8220;View Controller&#8221;. Klicke dazu doppelt auf die Navigation Bar und gib dann &#8220;Web View&#8221; ein.</p>
<p style="text-align: left;">Als nächstes fügen wir ein paar Objects hinzu, ein Textfeld und einen Button (s. Bild unten). Wähle dann gleich das Textfeld aus, öffne den Attributes inspector und gib bei <em>Text</em> &#8221;iosdevgermany.de&#8221; ein. Außerdem sollte der Haken bei &#8220;Clear when editing begins&#8221; gesetzt sein. Das bewirkt, dass sobald das Textfeld ausgewählt wird, der Text im Textfeld verschwindet.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Objects_einfügen2.png"><img class="aligncenter size-full wp-image-1290" title="Web View Tutorial - Objects einfügen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Objects_einfügen2.png" alt="" width="691" height="763" /></a></p>
<p style="text-align: left;">Nun erstellen wir einen neuen View Controller für unseren Web View. Der <em>View Controller</em> ist gleich das erste Object in der Library. Ziehe es rechts neben den ersten View Controller. Um die Controller besser anordnen zu können, kannst Du mit dem Lupensymbol rauszoommen.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-View_Controller_für_Web_View.png"><img class="aligncenter size-full wp-image-1292" title="Web View Tutorial - View Controller für Web View" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-View_Controller_für_Web_View.png" alt="" width="555" height="346" /></a></p>
<p style="text-align: left;">Bevor wir den Web View hinzufügen, verbinden wir die beiden View Controller mit einer Segue. Klicke dazu mit gedrückter ctrl-Taste auf den Button &#8220;Website anzeigen&#8221; und ziehe den blauen Faden auf den anderen View Controller. Wähle im daraufhin erscheinenden Menü &#8220;Push&#8221;.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Controller_verbinden_Segue.png"><img class="aligncenter size-full wp-image-1294" title="Web View Tutorial - Controller verbinden mit Segue" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Controller_verbinden_Segue.png" alt="" width="631" height="663" /></a></p>
<p style="text-align: left;">Da wir später im Code Daten zwischen den beiden Controllern schieben wollen, müssen wir auf die Segue zugreifen können. Das funktioniert nur, wenn wir dieser einen eindeutigen Identifier geben. Wähle also die Segue aus und öffne den <em>Attributes inspector</em>. Gib bei <em>Identifier</em> &#8221;ShowWebsite&#8221; ein.</p>
<p style="text-align: left;">Jetzt müssen wir nur noch einen Web View aus der Library in unsere ganz rechten View Controller ziehen. Dann sind wir mit dem Interface für&#8217;s Erste fertig. Achte darauf, dass der Web View den ganzen freien Platz im View einnimmt.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Der_Web_View.png"><img class="aligncenter size-full wp-image-1296" title="Web View Tutorial - Der Web View" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Der_Web_View.png" alt="" width="395" height="599" /></a></p>
<p style="text-align: left;">Bevor wir weitermachen, testen wir die App. Führe sie also aus und klicke auf den Button &#8220;Website anzeigen&#8221;. Daraufhin sollte der neue View Controller erscheinen.</p>
<p style="text-align: left;"><strong>3. Die Dateien für den neuen View Controller erstellen</strong></p>
<p style="text-align: left;">Zunächst benötigen wir die .m- und die .h-Datei für den neuen View Controller, in dem der Web View liegt.</p>
<p style="text-align: left;">Klicke mit der rechten Maustaste auf den Projektordner &#8220;UIWebViewTutorial&#8221; und wähle <em>New File&#8230;</em></p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Neue_Dateien.png"><img class="aligncenter size-full wp-image-1300" title="Web View Tutorial - Neue Dateien" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Neue_Dateien.png" alt="" width="358" height="427" /></a></p>
<p style="text-align: left;">Unter Xcode 4.3 befindet sich das <em>View Controller subclass</em>-Template mit im <em>Objective-C class</em>-Template. Wähle es deshalb aus und gib bei <em>Class</em> &#8221;WebViewViewController&#8221; ein. Außerdem sollte bei <em>Subclass of</em> &#8221;UIViewController&#8221; ausgewählt sein. Weder der Haken bei <em>Targeted for iPad</em> noch bei <em>With XIB for user interface</em> sollte gesetzt sein.</p>
<p style="text-align: left;">Klicke dann im nächsten Fenster auf <em>Create</em>.</p>
<p style="text-align: left;">Schließlich müssen wir die Dateien nur noch einem View Controller im Storyboard zuordnen. Öffne wieder &#8220;MainStoryboard.storyboard&#8221; und wähle den ganz rechten View Controller aus, den mit dem Web View. Öffne dann den <em>Identity inspector</em> und gib bei <em>Class</em> &#8221;WebViewViewController&#8221; ein.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Dateien_View_Controller_zuordnen.png"><img class="aligncenter size-full wp-image-1301" title="Web View Tutorial - Dateien View Controller zuordnen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Dateien_View_Controller_zuordnen.png" alt="" width="813" height="834" /></a></p>
<p style="text-align: left;"><strong>4</strong><strong>. Die Outlets erstellen</strong></p>
<p style="text-align: left;">Wir benötigen die Outlets von zwei der Objects, dem Textfeld und dem Web View. Um diese zu erstellen, wähle zuerst das Textfeld an und aktiviere dann den <em>Assistant editor</em> (mittlere Button von Editor in der Toolbar). Auf der rechten Seite sollte die Datei &#8220;ViewController.h&#8221; angezeigt werden. Klicke dann mit gedrückter ctrl-Taste auf das Textfeld und ziehe den Faden über die @end-Zeile. Nenne das Outlet &#8220;textField&#8221; und klicke auf <em>Connect</em>.</p>
<p style="text-align: left;">Wiederhole diesen Schritt für den Web View: Wähle ihn aus, ziehe den Faden über @end in &#8220;WebViewViewController.h&#8221; und nenne das Outlet &#8220;webView&#8221;.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Outlets_erstellen.png"><img class="aligncenter size-full wp-image-1303" title="Web View Tutorial - Outlets erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Outlets_erstellen.png" alt="" width="1405" height="955" /></a></p>
<p style="text-align: left;"><strong>5. Die Website anzeigen</strong></p>
<p>Jetzt kommen wir zum eigentlich wichtigen Teil des Tutorials. Dem Anzeigen der Website.</p>
<p>Der User gibt eine Adresse ins Textfeld ein, zum Beispiel &#8220;iosdevgermany.de&#8221;. Dieser Text wird dann dem WebViewViewController übergeben. In diesem fügen wir noch &#8220;http://www.&#8221; an die Webadresse an und öffne die Website im Web View. Das setzen wir jetzt im Code um.</p>
<p>Zuerst wollen wir also den Textfeld-Text dem WebViewViewController übergeben. Dazu benötigt dieser View Controller eine weitere Membervariable, in der wie den Text speichern.</p>
<p>Öffne also die Datei &#8220;WebViewViewController.h&#8221; und ändere sie wie folgt ab:</p>
<pre class="brush: objc; title: ; notranslate">#import &lt;UIKit/UIKit.h&gt;

@interface WebViewViewController : UIViewController {
    NSString *websiteName;
}
@property (copy, nonatomic) NSString * websiteName;
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end
</pre>
<p>Das einzig neue ist die Membervariable <em>websiteName</em> vom Typ NSString.</p>
<p>In &#8220;WebViewViewController.m&#8221; muss diese noch synthetisiert werden:</p>
<pre class="brush: objc; title: ; notranslate">@synthesize websiteName=_websiteName;</pre>
<p>Das ist die Standard-@synthesize Zeile für eine <em>weak-Property</em> (Genaueres im <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 3 – Detail View und Tab Bar Controller" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-3-detail-view-und-tab-bar-controller/">Storyboard-Tutorial Part 3</a>).</p>
<p>Selbstverständlich müssen wir den &#8220;WebViewViewController&#8221; noch in den &#8220;ViewController&#8221; einbinden, damit wir auf die neue Membervariable zugreifen können.</p>
<p>Öffne &#8220;ViewController.m&#8221; und füge</p>
<pre class="brush: objc; title: ; notranslate">#import &quot;WebViewViewController.h&quot;</pre>
<p>unter der anderen #import-Zeile ein.</p>
<p>Jetzt können wir diesem View Controller den Textfeld-Text übergeben. Füge folgende Methode hinzu:</p>
<pre class="brush: objc; title: ; notranslate">-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@&quot;ShowWebsite&quot;]) {
        WebViewViewController *website = [segue destinationViewController];
        website.websiteName = textField.text;
    }
}</pre>
<p>In der Methode <em>prepareForSegue:sender </em>übergeben wir dem WebViewViewController den Text aus dem Textfeld, noch bevor dieser View Controller aufgerufen wird. Hier kommt der vorhin festgelegte <em>Identifier, </em>&#8220;ShowWebsite&#8221;<em>,</em> der Segue zum Einsatz. Dann wird der Textfeld-Text in der eben erstellten Membervariable von WebViewViewController, <em>websiteName</em>, gespeichert.</p>
<p>Als nächstes muss der WebViewViewController nur noch dafür sorgen, dass die angegeben Website auch angezeigt wird. Damit er dies auch kann, müssen wir ein Protokoll, also ein Delegate, implementieren. Das sogenannte <em>UIWebViewDelegate</em>.</p>
<p>Öffne &#8220;WebViewViewController.h&#8221; und ändere die @interface-Zeile ab:</p>
<pre class="brush: objc; title: ; notranslate">@interface WebViewViewController : UIViewController &lt;UIWebViewDelegate&gt; {</pre>
<p>Nun muss das Delegate noch dem Web View im Storyboard zugewiesen werden. Öffne &#8220;MainStoryboard.storyboard&#8221; und suche im <em>Document Outline</em> nach dem Web View. Klicke dann mit gedrückter ctrl-Taste auf den Web View und ziehe den blauen Faden auf den <em>Web View View Controller</em>. Wähle dann den Punkt <em>delegate</em>.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Delegate_zuordnen.png"><img class="aligncenter size-full wp-image-1306" title="Web View Tutorial - Delegate zuordnen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Delegate_zuordnen.png" alt="" width="236" height="322" /></a></p>
<p>Schlussendlich kommen wir nun zum Öffnen der Website. Öffne die Datei &#8220;WebViewViewController.m&#8221; und ändere die Methode <em>viewDidLoad</em> wie folgt ab:</p>
<pre class="brush: objc; title: ; notranslate">- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view.
    self.title = self.websiteName;
    NSString *fullURL = [NSString stringWithFormat:@&quot;http://www.%@&quot;, self.websiteName];
    NSURL *websiteURL = [NSURL URLWithString:fullURL];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:websiteURL];
    [self.webView loadRequest:requestObj];
}</pre>
<p><span style="text-decoration: underline;">Zeile 5:</span> Der Vollständigkeit halber ändern wir den Titel der Navigation Bar im WebViewViewController auf den Namen der Website. Das heißt in der Navigation Bar stünde beispielsweise &#8220;iosdevgermany.de&#8221;.<br />
<span style="text-decoration: underline;">Zeile 6:</span> An den Namen der Website wird &#8220;http://www.&#8221; angehängt, damit eine vollständige Web-Adresse entsteht. Diese wird im NSString <em>fullURL</em> gespeichert.<br />
<em>Hinweis: Um zwei Zeichenketten zusammenzufügen verwendet man die Methode stringWithFormat. In dem String &#8220;http://www.%@&#8221; wird für %@ die dahinterstehende Variable, der Website-Name, eingefügt.</em><br />
<span style="text-decoration: underline;">Zeile 7:</span> Hier wird eine weitere Variable erstellt, vom Typ NSURL. Aus dem String <em>fullURL</em> wird so eine richtige URL.<br />
<span style="text-decoration: underline;">Zeile 8:</span> <em>requestObj</em> ist ein Objekt, das angibt, das eine Website geladen werden soll. Welche das ist wird mit <em>requestWithURL:</em> <em>websiteName</em> festgelegt.<br />
<span style="text-decoration: underline;">Zeile 9:</span> Schließlich öffnet der Web View die Website, indem er die <em>Request</em> lädt.</p>
<p>Endlich ist unser Web View funktionstüchtig. Führe die App nun einmal aus und klicke auf &#8220;Website anzeigen&#8221;. Nach einer kurzen Ladezeit sollte die Website angezeigt werden:</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Die_Website_wird_angezeigt.png"><img class="aligncenter  wp-image-1311" title="Web View Tutorial - Die Website wird angezeigt" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Die_Website_wird_angezeigt.png" alt="" width="249" height="469" /></a></p>
<p style="text-align: left;">Was mir allerdings noch nicht so gut gefällt, ist, dass immer nur ein kleiner Ausschnitt der Website angezeigt wird. Auch Zoomen ist nicht möglich. Das lässt sich schnell beheben.</p>
<p style="text-align: left;">Öffne &#8220;MainStoryboard.storyboard&#8221; und wähle den Web View aus. Lass ihn dir im Attributes inspector anzeigen und setze dann das Häkchen bei <em>Scales Page To Fit</em>.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Web_View_anpassen.png"><img class="aligncenter size-full wp-image-1313" title="Web View Tutorial - Web View anpassen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Web_View_anpassen.png" alt="" width="261" height="152" /></a></p>
<p style="text-align: left;">Führe die App nun erneut aus. Jetzt wird die ganze Website angezeigt und man kann sogar mit Hilfe der alt-Taste im Simulator zoomen.</p>
<p style="text-align: left;"><strong>6. Der Activity Indicator View</strong></p>
<p style="text-align: left;">Leider benötigen manche Website etwas länger zum Laden. Deshalb ist es sinnvoll, den Benutzer darauf hinzuweisen, das die Website noch lädt. Dazu eignet sich am Besten ein <em>Activity Indicator View</em>. Diesen werden wir jetzt einbauen.</p>
<p style="text-align: left;">Öffne &#8220;MainStoryboard.storyboard&#8221;, wenn sie nicht schon geöffnet ist, und suche in der Library nach dem Activity Indicator View. Ziehe ihn dann irgendwohin in den Web View, zum Beispiel in die Mitte. Öffne dann den Attributes inspector und ändere <em>Color</em> auf Schwarz:</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Activity_Indicator_View_im_Storyboard.png"><img class="aligncenter  wp-image-1315" title="Web View Tutorial - Activity Indicator View I'm Storyboard" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Activity_Indicator_View_im_Storyboard.png" alt="" width="612" height="652" /></a></p>
<p style="text-align: left;">Als nächstes benötigen wir das Outlet diese Objects. Schalte also wieder auf Assistant editor um und ziehe den blauen Faden vom Object zu den andere properties. Nenne das Outlet <em>loadingSign</em>:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Outlet_des_AIV.png"><img class="aligncenter size-full wp-image-1316" title="Web View Tutorial - Outlet des AIV" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Outlet_des_AIV.png" alt="" width="1404" height="955" /></a></p>
<p style="text-align: left;">Zum Schluss müssen wir noch zwei neue Methode zu &#8220;WebViewViewController.m&#8221; hinzufügen:</p>
<pre class="brush: objc; title: ; notranslate">-(void) webViewDidStartLoad:(UIWebView *)webView {
    [self.loadingSign startAnimating];
    self.loadingSign.hidden = NO;
}

-(void) webViewDidFinishLoad:(UIWebView *)webView {
    [self.loadingSign stopAnimating];
    self.loadingSign.hidden = YES;
}</pre>
<p>Zuerst die Methode <em>webViewDidStartLoad:</em>, die aufgerufen wird, wenn die Website beginnt zu laden. In dieser Methode starten wir die Animation des Activity Indicator Views und machen ihn sichtbar.</p>
<p>In <em>webViewDidFinishLoad:</em> machen wir das genaue Gegenteil. Wir stoppen die Animation und verstecken das Object.</p>
<p>Und schon sind wir fertig. Starte nun die App. Wenn der &#8220;Website anzeigen&#8221;-Button gedrückt wird, erscheint zuerst der kleine drehende Kreis, bevor die Website angezeigt wird.</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Die_fertige_App.png"><img class="aligncenter  wp-image-1319" title="Web View Tutorial - Die fertige App" src="http://www.iosdevgermany.de/wp-content/uploads/2012/03/WebViewTutorial-Die_fertige_App.png" alt="" width="238" height="446" /></a></p>
<p style="text-align: left;"><strong>5. Schluss</strong></p>
<p style="text-align: left;">Du kannst das fertige Xcode-Projekt wie immer downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/03/UIWebViewTutorial1.zip">UIWebViewTutorial</a></p>
<p style="text-align: left;">Dieses Tutorial wurde sich von einem Leser gewünscht. Du kannst mir gerne auch ein Tutorial vorschlagen. Entweder über die Kommentarfunktion oder das <a title="Kontakt" href="http://www.iosdevgermany.de/kontakt/">Kontakt-Formular</a>.</p>
<p style="text-align: left;">Bei Fragen kannst Du mir gerne ein Kommentar hinterlassen. Wenn Du keine Tutorials mehr verpassen willst, abonniere einfach den <a href="http://www.iosdevgermany.de/feed">Blog RSS</a> oder folge mir auf <a href="https://twitter.com/#!/iOsDevGermany">Twitter</a>.</p>
<div class="shr-publisher-1281"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/fSsw4iqm2dw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/uiwebview-tutorial-deutsch-websites-anzeigen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/uiwebview-tutorial-deutsch-websites-anzeigen/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=uiwebview-tutorial-deutsch-websites-anzeigen</feedburner:origLink></item>
		<item>
		<title>iPhone SDK Tutorial deutsch 6 – Storyboard Part 3 – Detail View und Tab Bar Controller</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/c1rORj1i5os/</link>
		<comments>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-3-detail-view-und-tab-bar-controller/#comments</comments>
		<pubDate>Sat, 25 Feb 2012 17:50:13 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Segues]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[Tab Bar Controller]]></category>
		<category><![CDATA[UITableView]]></category>
		<category><![CDATA[Xcode 4.2]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=1191</guid>
		<description><![CDATA[Das ist Part 3 des Storyboard Tutorials in Xcode 4.2. Es geht um einen Tab Bar Controller als Detail View. Solltest Du die anderen Teile des Tutorials noch nicht gelesen haben und dich noch nicht mit dem Storyboard auskennen, solltest &#8230; <a href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-3-detail-view-und-tab-bar-controller/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Artikelbild.png"><img class="alignleft  wp-image-1273" title="Tutorial 6.3 - Artikelbild" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Artikelbild.png" alt="" width="306" height="278" /></a>Das ist Part 3 des Storyboard Tutorials in Xcode 4.2. Es geht um einen Tab Bar Controller als Detail View.<br />
Solltest Du die anderen Teile des Tutorials noch nicht gelesen haben und dich noch nicht mit dem Storyboard auskennen, solltest Du mit <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 1 – Grundlagen" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen/">Part 1</a> und <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 2 – Table View" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/">Part 2</a> anfangen. Auch dieses Xcode-Projekt baut auf den anderen Tutorials auf, falls Du es also nicht mehr gespeichert hast, kannst Du es hier downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2011/12/iPhone_SDK_Tutorial_deutsch_6-Storyboard_Part_2-Table_View.zip">Xcode-Projekt_Storyboard_Tutorial_Part_2</a>.</p>
<p>Jetzt noch eine Übersicht, was Du in diesem Tutorial lernen wirst:</p>
<ul>
<li>Implementieren eines Detail Views einer Table View</li>
<li>Implementieren eines Tab Bar Controllers als Detail View</li>
<li>Arbeiten mit Segues</li>
</ul>
<p><span id="more-1191"></span></p>
<p><strong>1. Die App</strong></p>
<p>Bisher besteht unserer App nur aus einem &#8220;Hauptmenü&#8221;, über welches man zu einer Tabelle gelangt, die ein paar Spieler auflistet. Wir werden die App insofern erweitern, dass die Spieler nicht nur aus dem Namen bestehen, sondern auch weitere Attribute haben. Diese werden angezeigt, sobald man einen Spieler auswählt. Die Daten werden in zwei Kategorien aufgeteilt, die mit einem Tab Bar Controller dargestellt werden.</p>
<p><strong>2. Das Model</strong></p>
<p>Wir beginnen, indem wir das Model unseres Projekts erweitern. Ein Model enthält die Daten einer App, also in unserem Fall wird das eine Klasse für die Spieler in der Spielerliste sein. Wenn Du noch nichts von der MVC-Struktur (Model-View-Controller) gehört hast, kannst du dich <a href="http://de.wikipedia.org/wiki/Model_View_Controller">hier</a> einlesen (ein Beitrag darüber kommt bald).</p>
<p>Starte also Xcode und wähle in der Menüleiste File&#8211;&gt;Open&#8230;, um das bestehende Projekt zu öffnen.</p>
<p>Wie gesagt beginnen wir mit einer Klasse für die Spieler. Eine Klasse erstellt man meist in zwei neuen Dateien. Dazu klickst Du mit der rechten Maustaste auf den Projektordner (&#8220;Tutorial6&#8243;) und wählst den Menüpunkt &#8220;New File&#8230;&#8221;. Im erscheinenden Dialog benötigen wir das Template &#8220;Objective-C class&#8221; und nicht wie im zweiten Part eine &#8220;UIViewController subclass&#8221; (wir wollen ja keinen neuen View Controller erstellen). Klicke doppelt auf das Symbol und gibt dann bei <em>Class</em> &#8221;Player&#8221; ein. Achte darauf, dass bei <em>Subclass of </em>&#8220;NSObject&#8221; ausgewählt ist. Den Speicherort ändern wir nicht, sondern klicken gleich auf &#8220;Create&#8221;.</p>
<p>Bevor ich den folgenden Code erkläre, ersetze mit ihm den Code in der jeweiligen Datei:</p>
<p>Player.h:</p>
<pre class="brush: objc; title: ; notranslate">
#import &lt;Foundation/Foundation.h&gt;

@interface Player : NSObject {
    NSString *_name;
    NSNumber *_score;

    NSString *_country;
    NSString *_city;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSNumber *score;

@property (nonatomic, copy) NSString *country;
@property (nonatomic, copy) NSString *city;

-(id) initWithName: (NSString *) newName score: (NSNumber *) newScore country: (NSString *) newCountry city: (NSString *) newCity;

@end
</pre>
<p>Player.m:</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;Player.h&quot;

@implementation Player
@synthesize name = _name;
@synthesize score = _score;
@synthesize country = _country;
@synthesize city = _city;

-(id) initWithName:(NSString *)newName score:(NSNumber *)newScore country:(NSString *)newCountry city:(NSString *)newCity {
    self = [super init];
    if (nil != self) {
        self.name = newName;
        self.score = newScore;
        self.country = newCountry;
        self.city = newCity;
    }
    return self;
}

@end
</pre>
<p>Im Großen und Ganzen sieht so immer eine Klasse eines Models aus. Wir deklarieren in Player.h ein paar Variablen und eine Methode, mit der wir die Werte später definieren können. In Player.m wird diese Methode lediglich definiert.</p>
<p>Bei genauerem Betrachten stellt man allerdings fest, dass diese Klasse etwas anders aussieht. Wenn Du dir &#8220;Player.h&#8221; nochmal anschaust, wirst Du feststellen, dass die Instanzvariablen, also die Variablen zwischen den geschweiften Klammer, einen Underscore &#8220;_&#8221; haben. Das heißt mit @synthesize name = _name weisen wir der Property <em>name</em> die Instanzvariable _name zu. Die Erklärung ist recht simpel:<br />
Mit @property erstellt man ja bekanntlich getter- und setter-Methoden für eine Variable. Mit der getter-Methode erhält man dann den Wert der Variable und mit der setter-Methode kann man diesen Wert ändern. Der Zugriff auf diese Methode erfolgt mit <em>self.variable</em>. Würde man das <em>self</em> weglassen, so würde man nicht auf die Property, sondern auf die Variable an sich zugreifen. Und dies wäre falsch, da man dann nicht die getter- bzw. setter-Methode verwendet. Indem man die Variable nun mit einem Underscore deklariert (bspw. _variable) und dann bei @synthesize variable=_variable schreibt, schütz man sich selbst davor, aus Versehen die Variable statt der Property zu verwenden.</p>
<p>Einen weiteren Unterschied kann man in &#8220;Player.h&#8221; feststellen. Hinter <em>@property</em> steht statt wie sonst (nonatomic, strong) oder (nonatomic, weak) diesmal <em>copy</em>. Ich möchte an dieser Stelle nicht allzu genau auf dieses Stichworts eingehen, da man dafür etwas tiefer in das Memory Management eintauchen müsste, was den Rahmen dieses Tutorial absolut sprengen würde. Man kann sich aber einfach merken, das man Properties vom Typen <em>NSString, NSArray, NSDictionary, NSNumber</em>, also Typen mit <em>NS, </em>meistens mit <em>copy</em> erstellt. Allerdings werden Properties mit Typen, die noch ein <em>Mutable</em> enthalten, also z.B. <em>NSMutableArray, NSMutableDictionary </em>etc., meistens mit <em>strong</em> deklariert.</p>
<p>Die init-Methode kommt jetzt auch gleich zum Einsatz. Deswegen müssen wir die Klasse Player in PlayerlistViewController einbinden. Schreibe Folgendes unter die erste #import-Zeile in &#8220;PlayerlistViewController.m&#8221;:</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;Player.h&quot;
</pre>
<p>Im vorherigen Teil haben wir die Spieler einfach in viewDidLoad als Zeichenketten, also NSStrings, deklariert und in einem Array (playerList) gespeichert. Da wir jetzt aber ein aufwendigeres Model haben, müssen wir diese Methode abändern:</p>
<pre class="brush: objc; title: ; notranslate">
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.playerList = [NSMutableArray arrayWithCapacity:20];

    Player *player1 = [[Player alloc]initWithName:@&quot;Andreas&quot; score:[NSNumber numberWithInt:40000] country:@&quot;Deutschland&quot; city:@&quot;Regensburg&quot;];
    [self.playerList addObject:player1];

    Player *player2 = [[Player alloc]initWithName:@&quot;Stefan&quot; score:[NSNumber numberWithInt:35000] country:@&quot;Deutschland&quot; city:@&quot;Regensburg&quot;];
    [self.playerList addObject:player2];

    Player *player3 = [[Player alloc]initWithName:@&quot;Alex&quot; score:[NSNumber numberWithInt:55400] country:@&quot;Deutschland&quot; city:@&quot;Regensburg&quot;];
    [self.playerList addObject:player3];

}
</pre>
<p>Wir erstellen einfach drei verschiedene Spieler und fügen sie der Spieler-Liste hinzu. Zu beachten ist, dass obwohl wir für jedes Objekt mit <em>alloc</em> Speicher reservieren, wir kein einziges Mal <em>release</em> aufrufen. Das bleibt uns dank dem <em>Automatic Reference Counting</em> erspart, denn dadurch wird der Speicher automatisch freigegeben. Versuchten wir dies mit der release-Anweisung manuell zu tun, würde Xcode sogar einen Fehler auswerfen, da wir beim Erstellen des Projekts in Part 1 des Tutorials eingestellt haben, dass wir ARC benutzen wollen.</p>
<p><em>viewDidLoad</em> ist aber nicht die einzige Methode die wir ein bisschen verändern müssen. Logischerweise ist <em>tableView:cellForRowAtIndexPath: </em>auch nicht mehr ganz aktuell. Ändere die Methode wie folgt:</p>
<pre class="brush: objc; title: ; notranslate">
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@&quot;PlayerCell&quot;];
    Player *player = [self.playerList objectAtIndex:indexPath.row];
    cell.textLabel.text = player.name;

    // Configure the cell...

    return cell;
}
</pre>
<p>Da im Array playerList nicht mehr nur einfach NSStrings gespeichert sind, sondern Player-Objekte, müssen wir den passenden Eintrag in einem temporären Player-Objekt speichern und dann der Zelle den Spielernamen zuweisen.</p>
<p>Bisher haben wir die App nicht erweitert, sondern sie nur vorbereitet für den nächsten Schritt. Bevor wir zu diesem übergehen, testen wir, ob noch alles wie gehabt funktioniert. Führe dazu die App aus. Die Tabelle mit den Spielern sollte ganz normal angezeigt werden.</p>
<p><strong>3. Der Tab Bar Controller</strong></p>
<p>Wir wollen, dass wenn eine Tabellen-Zeile ausgewählt wird, ein Tab Bar Controller angezeigt wird. Diesen werden wir jetzt im Storyboard erstellen.</p>
<p>Öffne die Datei &#8220;MainStoryboard.storyboard&#8221; und suche in der Library nach dem <em>Tab Bar Controller</em>. Bevor du das Object in den Editor ziehst, kannst du noch herauszoomen, damit Du ein besseren Überblick hast. Ziehe den Controller am besten neben den Table View Controller.</p>
<p><em>Tipp: Wenn du im Nachhinein mehrere Controller auf einmal verschieben möchtest, kannst du mit gedrückter cmd-Taste die einzelnen Docks anklicken und die ausgewählten Elemente zusammen verschieben.</em></p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Der_Tab_Bar_Controller.png"><img class="alignleft size-large wp-image-1213" title="Tutorial 6.3 - Der Tab Bar Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Der_Tab_Bar_Controller-1024x720.png" alt="" width="640" height="450" /></a></p>
<p>Damit das Ganze seine Ordnung hat geben wir den Tabs noch eine aussagekräftige Bezeichnung. Zoome also wieder heran und klicke im ersten View Controller doppelt auf den Text in der Tab Bar (beachte, dass du im View Controller, <strong>nicht</strong> im Tab Bar Controller, auf die Tab Bar klicken musst). Gib einfach &#8220;Spiel-Charakter&#8221; ein. Das zweite Tab Bar Item können wir im zweiten View Controller bearbeiten. Nenne es &#8220;Account&#8221;.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Die_Tab_Bar_Items_bearbeiten.png"><img class="aligncenter  wp-image-1214" title="Tutorial 6.3 - Die Tab Bar Items bearbeiten" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Die_Tab_Bar_Items_bearbeiten.png" alt="" width="491" height="615" /></a> Wie Du siehst ändert sich die Tab Bar im Tab Bar Controller automatisch mit.</p>
<p style="text-align: left;">Zunächst fügen wir den beiden View Controller noch Objects hinzu. Alles was wir benötigen sind ein paar Labels. Ziehe sie, wie in der Abbildung gezeigt, in die View Controller. Anschließend beschriften wir die Labels und ändern die Größe der rechten Labels, damit auch längere Namen in ihnen Platz haben.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial_6_3-Tabs_bearbeiten.png"><img class="alignright size-full wp-image-1218" title="Tutorial 6.3 - Tabs bearbeiten" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial_6_3-Tabs_bearbeiten.png" alt="" width="690" height="565" /></a></p>
<p>Das Interface der beiden View Controller ist damit fertig.</p>
<p><strong>4. Die View Controller Im Code</strong></p>
<p style="text-align: left;">Als Nächstes werden wir die Dateien für die beiden View Controller erstellen. Dadurch können wir später den Text der Labels der Controller setzen, sodass Name, Höchstpunktzahl, Land und Stadt richtig angezeigt werden.</p>
<p style="text-align: left;">Klicke mit der rechten Maustaste auf den Projektordner und wähle &#8220;New File&#8230;&#8221;. <del>Klicke im erscheinenden Fenster auf das <em>UIViewController subclass</em>-Template.</del>(Xcode 4.2)</p>
<p style="text-align: left;"><span style="text-decoration: underline;">Xcode 4.3:</span> Klicke im erscheinenden Fenster auf das Objective-C class-Template. Im nächsten Fenster sollte bei <em>Subclass of</em> &#8221;UIViewController&#8221; ausgewählt sein.</p>
<p style="text-align: left;">Bei <em>Class</em> schreiben wir &#8220;CharacterInformationViewController&#8221;. Beachte, dass weder ein Häkchen bei &#8220;Targeted for iPad&#8221; noch bei &#8220;With XIB for user Interface&#8221;, gesetzt sein sollte. Die <em>Subclass</em> sollte auf &#8220;UIViewController&#8221; eingestellt sein.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Neuer_View_Controller.png"><img class="aligncenter size-full wp-image-1225" title="Tutorial 6 3 - Neuer View Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Neuer_View_Controller.png" alt="" width="736" height="501" /></a></p>
<p style="text-align: left;">Klicke auf Next und dann auf Create; wir speichern die Dateien an Ort und Stelle ab.</p>
<p style="text-align: left;">Wiederhole diesen Schritt (ab 4.) für einen weiteren View Controller namens &#8220;AccountInformationViewController&#8221;.</p>
<p style="text-align: left;">Diese Dateien müssen wir als nächstes einem View Controller im Storyboard zuweisen. Öffne wieder die Datei &#8220;MainStoryboard.storyboard&#8221;, wenn sie nicht schon geöffnet ist, und wähle den &#8220;Spiel-Charakter&#8221;-View Controller aus. Lass ihn dir dann im <em>Identity inspector</em> anzeigen und trage bei <em>Class</em> den Namen des ersten View Controllers, &#8220;CharacterInformationViewController&#8221;, ein.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-View_Controller_im_Storyboard.png"><img class="aligncenter size-full wp-image-1229" title="Tutorial 6.3 - View Controller im Storyboard" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-View_Controller_im_Storyboard.png" alt="" width="698" height="665" /></a></p>
<p style="text-align: left;">Wiederhole auch diesen Schritt beim anderen View Controller.</p>
<p style="text-align: left;">Da wir die Labels auf der rechten Seite später im Code bearbeiten möchten, sodass sie die Informationen des Spielers anzeigen, erstellen wir Outlets für diese Labels.</p>
<p style="text-align: left;">Dazu stellen wir den Editor Modus mit Hilfe des mittleren Button bei &#8220;Editor&#8221; in der Tool Bar auf <em>Assistant editor. </em>Wähle dann im Storyboard den &#8220;Character Information View Controller&#8221; aus. Auf der rechten Seite sollte die Datei &#8220;CharacterViewController.h&#8221; im Code-Editor angezeigt werden.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Assistant_editor.png"><img class="aligncenter size-large wp-image-1241" title="Tutorial 6.3 - Assistant editor" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Assistant_editor-1024x690.png" alt="" width="640" height="431" /></a></p>
<p style="text-align: left;">Alles weitere ist jetzt ganz einfach. Wie immer klicken wir mit gedrückter ctrl-Taste auf das Object, also das &#8220;Label&#8221;-Label neben &#8220;Spieler-Name:&#8221; und ziehen den blauen Faden in den Code-Editor zwischen @interface und @end. Nenne das Outlet &#8220;nameLabel&#8221;.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Outlet_erstellen.png"><img class="aligncenter size-full wp-image-1243" title="Tutorial 6.3 - Outlet erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Outlet_erstellen.png" alt="" width="904" height="420" /></a></p>
<p style="text-align: left;">Auch diesen Schritt wiederholen wir für das Label rechts neben dem Label &#8220;Höchstpunktzahl:&#8221; und die anderen, welche sich im &#8220;AccountInformationViewController&#8221; befinden. Diese Outlets werden deshalb logischerweise in &#8220;AccountInformationViewController.h&#8221; deklariert. Nenne die Outlets &#8220;scoreLabel&#8221;, &#8220;countryLabel&#8221; und &#8220;cityLabel&#8221;.</p>
<div id="attachment_1244" class="wp-caption aligncenter" style="width: 387px"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Die_restlichen_Outlets_erstellen.png"><img class="size-full wp-image-1244" title="Tutorial 6.3 - Die restlichen Outlets erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Die_restlichen_Outlets_erstellen.png" alt="" width="377" height="817" /></a><p class="wp-caption-text">Für diese Labels sollen die Outlets erstellt werden.</p></div>
<p>Wenn Du fertig bist, stelle den Editor wieder auf <em>Standard editor </em>ein. Weiter geht&#8217;s. Als nächstes erstellen wir die Variablen für die Daten des Spielers. Wir deklarieren sie im CharacterInformationViewController bzw. im AccountInformationViewController. Wenn eine Zeile ausgewählt wird, können wir dann später diesen Variablen den je nach ausgewähltem Spieler passenden Wert zuweisen. Ändere die angegebenen Datei wie folgt ab:</p>
<p>CharacterInformationViewController.h</p>
<pre class="brush: objc; title: ; notranslate">
#import &lt;UIKit/UIKit.h&gt;

@interface CharacterInformationViewController : UIViewController {
    NSString *_name;
    NSNumber *_score;
}
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *scoreLabel;
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSNumber *score;

@end
</pre>
<p>AccountInformationViewController.h</p>
<pre class="brush: objc; title: ; notranslate">
#import &lt;UIKit/UIKit.h&gt;

@interface AccountInformationViewController : UIViewController {
    NSString *_country;
    NSString *_city;
}
@property (weak, nonatomic) IBOutlet UILabel *countryLabel;
@property (weak, nonatomic) IBOutlet UILabel *cityLabel;
@property (copy, nonatomic) NSString *country;
@property (copy, nonatomic) NSString *city;

@end
</pre>
<p>Für den Namen, das Land und die Stadt erstellen wir je einen NSString und für die Höchstpunktzahl eine NSNumber. Außerdem legen wir noch die properties für die Variablen an, da wir später von außen auf sie zugreifen werden. Zu jedem @property gehört wie immer ein @synthesize. Füge deshalb folgenden Code unter die anderen @synthesize-Zeile in der jeweiligen Datei ein.</p>
<p>CharacterInformationViewController.m</p>
<pre class="brush: objc; title: ; notranslate">
@synthesize name=_name;
@synthesize score=_score;
</pre>
<p>AccountInformationViewController.m</p>
<pre class="brush: objc; title: ; notranslate">
@synthesize country=_country;
@synthesize city=_city;
</pre>
<p>Damit die Daten des Spielers dann auch angezeigt werden, müssen wir jetzt noch den Text der Labels setzen, bevor der View angezeigt wird. Dazu ändern wir die Methode <em>viewDidLoad</em> in beiden Controller ab.</p>
<p>CharacterInformationViewController.m</p>
<pre class="brush: objc; title: ; notranslate">
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.nameLabel.text = self.name;
    self.scoreLabel.text = [self.score stringValue];
}
</pre>
<p>AccountInformationViewController.m</p>
<pre class="brush: objc; title: ; notranslate">
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.countryLabel.text = self.country;
    self.cityLabel.text = self.city;
}
</pre>
<p style="text-align: left;">Endlich sind die beiden View Controller des Tab Bar Controllers fertig und bereit aufgerufen zu werden.</p>
<p style="text-align: left;"><strong>5. Eine Tabellenzeile auswählen</strong></p>
<p>Nun kommen wir zum wichtigsten Teil. Wie können wir nun den Tab Bar Controller anzeigen lassen, wenn eine Tabellenzeile angetippt wird?<br />
In älteren Xcode-Versionen haben wir dazu die Methode <em>tableView:didSelectRowAtIndexPath: </em>verwendet. Das ist zwar immer noch möglich, allerdings gibt es dank des Storyboards eine bessere Möglichkeit. Und zwar kommen hier die sogenannten Segues ins Spiel. Ich habe sie schon in Part 1 des Tutorials angesprochen, allerdings ohne genauer darauf einzugehen.</p>
<p>Bevor ich die Segues genauer erkläre, sehen wir sie uns im Storyboard an. Öffne die Datei &#8220;MainStoryboard.storyboard&#8221;. Stelle sicher, dass im Document Outline das Object <em>Table View </em>in der &#8220;Playerlist View Controller Scene&#8221; ausgeklappt ist, damit die <em>Table View Cell</em> sichtbar ist. Klicke dann mit gedrückter ctrl-Taste auf diese Table View Cell im Document Outline und ziehe den blauen Faden auf den <em>Tab Bar Controller</em> in der &#8220;Tab Bar Controller Scene&#8221;. Wähle im erscheinenden Menü die Option &#8220;Push&#8221;.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Segue_erstellen.png"><img class="aligncenter size-full wp-image-1232" title="Tutorial 6.3 - Segue erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Segue_erstellen.png" alt="" width="241" height="702" /></a></p>
<p>Daraufhin erscheint innerhalb der &#8220;Playerlist View Controller Scene&#8221; ein neues Element namens &#8220;Segue from UITableViewCell to Tab Bar Controller&#8221;. Der lange Name beschreibt einfach Ursprung und Ziel der Segue. Im Editor wird die Segue als Pfeil mit Kreis dargestellt.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Die_Segue.png"><img class="aligncenter size-full wp-image-1233" title="Tutorial 6.3 - Die Segue" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Die_Segue.png" alt="" width="904" height="728" /></a></p>
<p>Bei Segues ist es so gut wie immer sinnvoll, sie mit einem eindeutigen Identifier auszustatten. Um das zu tun, wählt man die Segue wir ein normales Objects aus, indem man im Editor oder im Document Outline darauf klickt, und öffnet dann den <em>Attributes inspector</em> und gib bei <em>Identifier</em> &#8221;ShowPlayerDetails&#8221; ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Identifier_der_Segue.png"><img class="aligncenter size-full wp-image-1248" title="Tutorial 6.3 - Identifier der Segue" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Identifier_der_Segue.png" alt="" width="260" height="120" /></a></p>
<p>Damit ist der Identifier festgelegt.</p>
<p>Was ist also eine Segue? Segues stellen im Storyboard den Wechsel zwischen zwei Controllern dar. Deshalb auch das Icon eine Segue:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Icon_einer_Segue.png"><img class="aligncenter size-full wp-image-1235" title="Tutorial 6.3 - Icon einer Segue" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-Icon_einer_Segue.png" alt="" width="43" height="43" /></a></p>
<p>In Part 1 haben wir eine Segue zwischen dem Button im 1. View Controller und dem Table View Controller erstellt. Das bewirkt, dass wenn der Button gedrückt wird, der Table View Controller erscheint. So ist es auch bei der neuen Segue. Sobald eine Tabellenzeile ausgewählt wird, soll der Tab Bar Controller angezeigt werden.</p>
<p>Einen kleinen Unterschied gibt es aber. Wir wollen, dass die Informationen des Spielers in der Tabelle in den View Controllern des Tab Bar Controllers angezeigt werden. Das bedeutet, wir müssen Daten zwischen den beiden Controllern schieben. Früher hätten wir dies innerhalb der Methode <em>tableView:didSelectRowAtIndexPath:</em> bewerkstelligt. Auf diese Methode werden wir diesmal aber gänzlich verzichten und stattdessen mit einer anderen Methode arbeiten: <em>prepareForSegue:sender:</em>.<br />
Diese Methode wird aufgerufen, bevor der Wechsel zwischen den Controllern stattfindet. Das ist der perfekte Zeitpunkt um Daten zu schieben.</p>
<p>Die Methode gehört immer zum Ursprungs Controller, da sie ja noch vor der <em>Transition</em>, also dem Wechsel, aufgerufen wird. Das bedeutet, wir müssen sie in der Datei &#8220;PlayerlistViewController.m&#8221; definieren. Bevor wir die Methode aber definieren importieren wir noch die Header-Dateien der beiden View Controller des Tab Bar Controllers, da wir diese in der folgenden Methode benötigen. Schreibe also folgenden Code unter die anderen #import-Anweisungen in &#8220;PlayerlistViewController.m:</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;CharacterInformationViewController.h&quot;
#import &quot;AccountInformationViewController.h&quot;
</pre>
<p>Jetzt kommen wir zur eigentlichen Methode. Füge sie zu den anderen Methode in &#8220;PlayerlistViewController.m&#8221; hinzu.</p>
<pre class="brush: objc; title: ; notranslate">
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@&quot;ShowPlayerDetails&quot;]) {
        UITabBarController *detailController = [segue destinationViewController];

        CharacterInformationViewController *detailCharacterInformationTab = [detailController.viewControllers objectAtIndex:0];
        AccountInformationViewController *detailAccountInformationTab = [detailController.viewControllers objectAtIndex:1];
        Player *player = [self.playerList objectAtIndex:[self.tableView indexPathForSelectedRow].row];

        detailCharacterInformationTab.name = player.name;
        detailCharacterInformationTab.score = player.score;
        detailAccountInformationTab.country = player.country;
        detailAccountInformationTab.city = player.city;
    }
}
</pre>
<p>Nun zur Erklärung:<br />
<span style="text-decoration: underline;">Zeile 2</span>: <em>prepareForSegue:sender:</em> ist eine allgemeine Methode, die für alle Segues ausgelegt ist, die von <em>einem</em> Controller weggehen. Das können auch mal durchaus mehrere sein. Deshalb wird in dieser Zeile festgestellt, um welche Segue es sich handelt. Da wir vorhin im Storyboard den Identifier festgelegt haben, können wir jetzt ganz einfach rausfinden, ob es sich um die richtige Segue handelt.<br />
<span style="text-decoration: underline;">Zeile 3</span>: In dieser Zeile erstellen wir einen Tab Bar Controller, der aufzurufende Controller. Um diesen Tab Bar Controller mit dem im Storyboard zu verknüpfen, verwenden wir die Methode <em>destinationViewController </em>des Segue-Arguments, welche uns den Ziel-Controller der Segue zurückgibt.<br />
<span style="text-decoration: underline;">Zeile 5-6</span>: Zunächst erstellen wir die Instanzen der beiden View Controller des Tab Bar Controllers. Auch diese müssen wir wieder mit dem passenden View Controller im Storyboard verbinden. Diesmal verwenden wir die Methode <em>objectAtIndex</em> des Tab Bar Controllers. Sie liefert uns je nach angegebenen Index den passenden View Controller innerhalb des Tab Bar Controllers. Da man in der Informatik bei 0 zu zählen beginnt, befindet sich der erste Tab auch beim Index 0, der zweite beim Index 1.<br />
<span style="text-decoration: underline;">Zeile 7</span>: Hier erstellen wir ein Player-Objekt, welches den richtigen Spieler aus der Spielerliste zugewiesen bekommt. Um das richtige Element aus dem Array playerList zu erhalten, verwenden wir <em>[self.tableView indexPathForSelectedRow].row</em>. Das bewirkt, dass in der Table View die vom User ausgewählte Zeile gesucht wird und deren Zeilennummer als Index im Array verwendet wird. Im Prinzip also kein großer Unterschied gegenüber dem, wenn wir mit der Methode <em>tableView:didSelectRowAtIndexPath</em> arbeiten.<br />
<span style="text-decoration: underline;">Zeile 9-12</span>: Hier weisen wir den Variablen, die wir vorhin innerhalb von <em>CharacterInformationViewController</em> und <em>AccountInformationViewController</em> erstellt haben, den jeweiligen Wert aus dem Player-Objekt zu. Dadurch, dass wir in den viewDidLoad-Methoden der beiden View Controller den Labeln den Wert der Variablen zugewiesen haben, werde die Spieler-Daten im Detail View richtig angezeigt.</p>
<p>Vielleicht fragst Du dich, wieso in dieser Methode nirgends ein neuer View Controller aufgerufen wird. Das liegt daran, dass dies das Storyboard übernimmt. Die Methode <em>prepareForSegue:sender: &#8220;</em>bereitet&#8221; ja nur die Transition vor. Der eigentliche Wechsel ist dann die Segue an sich.</p>
<p>Pfew! Jetzt erstmal kräftig durchatmen, denn wir sind soweit fertig mit unserer App. Jetzt nur noch hoffen, dass wir keinen Fehler gemacht haben und wir die App fehlerfrei ausführen können. Wenn alles passt funktioniert die App einwandfrei. Wir können einen Spieler der Tabelle auswählen und uns die Daten schön sortiert mit einer Tab Bar anzeigen lassen.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-die_fertige_App.png"><img class="aligncenter size-large wp-image-1254" title="Tutorial 6.3 - Die fertige App" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_3-die_fertige_App-1024x502.png" alt="" width="640" height="313" /></a></p>
<p><strong>6. Schluss</strong></p>
<p>In diesem Tutorial hast Du viele neue Dinge gelernt. Deswegen, wenn Du noch irgendwelche Fragen hast, ich etwas nicht ausführlich genug erklärt habe oder Du einen Fehler gefunden hast, würde ich mich freuen, wenn Du mir ein Kommentar schreibst.</p>
<p>Lass mich außerdem wissen, ob Du dir ein weiteres Tutorial zum Thema Storyboard wünscht. Auch über Tutorial-Vorschläge jeglicher Art freue ich mich.</p>
<p>Das fertige Xcode Projekt gibt&#8217;s wie immer zum Downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Tutorial6_31.zip">Tutorial6_3</a></p>
<p>Wenn Du möchtest kannst du gerne die <a href="http://www.iosdevgermany.de/feed">Blog RSS</a> abonnieren oder mir auf <a href="https://twitter.com/#!/iOsDevGermany">Twitter</a> folgen.</p>
<div class="shr-publisher-1191"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/c1rORj1i5os" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-3-detail-view-und-tab-bar-controller/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-3-detail-view-und-tab-bar-controller/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=iphone-sdk-tutorial-deutsch-6-storyboard-part-3-detail-view-und-tab-bar-controller</feedburner:origLink></item>
		<item>
		<title>UIScrollView Tutorial – Scrollen und Zoomen</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/ZdzNg5OjN7w/</link>
		<comments>http://www.iosdevgermany.de/tutorial/uiscrollview-tutorial-scrollen-und-zoomen/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 10:06:56 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[UIImageView]]></category>
		<category><![CDATA[UIScrollView]]></category>
		<category><![CDATA[Xcode 4.2]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=1124</guid>
		<description><![CDATA[Einleitung Wenn man sehr viele oder sehr große Informationen, wie beispielsweise ein hochauflösendes Bild, auf dem iPhone darstellen will, benötigt man schnell mal mehr Platz, als einem das Display bietet. Deswegen gibt es ein Object namens Scroll View. Ein Scroll &#8230; <a href="http://www.iosdevgermany.de/tutorial/uiscrollview-tutorial-scrollen-und-zoomen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><strong>Einleitung</strong></p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/ScrollViewArtikelbild.png"><img class="alignleft  wp-image-1181" title="ScrollView Artikelbild" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/ScrollViewArtikelbild.png" alt="" width="286" height="275" /></a>Wenn man sehr viele oder sehr große Informationen, wie beispielsweise ein hochauflösendes Bild, auf dem iPhone darstellen will, benötigt man schnell mal mehr Platz, als einem das Display bietet. Deswegen gibt es ein Object namens <strong>Scroll View</strong>. Ein Scroll View ist wie ein normaler View, nur dass man, wie auf einer Internetseite, vertikal und/oder horizontal scrollen kann. Außerdem bieten Scroll Views die Möglichkeit, an ein Bild heran oder heraus zu zoomen und vieles mehr.</p>
<p>Hier also eine kleine Übersicht, was du in diesem Tutorial lernen wirst:</p>
<ul>
<li>Implementierung eines Scroll Views</li>
<li>Zoomen in einem Scroll View</li>
<li>Benutzen eines Image Views</li>
</ul>
<div><span style="font-size: small;"><span class="Apple-style-span" style="line-height: 24px;"><span id="more-1124"></span></span></span></div>
<p><strong>1. Die App</strong></p>
<p>Die App wird eine einzelne Scene mit einem Scroll View sein. Dieser wird ein Bild mit den Maßen 320&#215;900 enthalten, also zu groß für das Display. Um das Bild trotzdem anzeigen zu können, wird man Scrollen und Zoomen können. Los geht&#8217;s.</p>
<p><strong>2. Das Interface</strong></p>
<p>Öffne Xcode und klicke im Startup-Fenster auf &#8220;Create a new Xcode project&#8221;. Für das Tutorial eignet sich am besten das <em>Single View Application</em>-Template. Bei <em>Product Name</em> kannst du bspw. &#8220;UIScrollViewTutorial&#8221; eingeben. Die restlichen Projekt-Optionen sollten so wie immer sein:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Projekt_Optionen3.png"><img class="aligncenter size-full wp-image-1132" title="UIScrollView Tutorial - Projekt Optionen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Projekt_Optionen3.png" alt="" width="760" height="520" /></a></p>
<p>Gib schließlich noch den Speicherort an und klicke auf Create.</p>
<p>Öffne gleich zuerst die Datei &#8220;MainStoryboard.storyboard&#8221;.<br />
Zu Beginn benötigen wir das eigentliche Scroll View-Object. Suche es in der Library und ziehe den Scroll View so in das Fenster, dass er seine volle Größe annimmt.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Der_Scroll_View_im_Controller.png"><img class="aligncenter size-full wp-image-1134" title="UIScrollView Tutorial - Der Scroll View im Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Der_Scroll_View_im_Controller.png" alt="" width="364" height="582" /></a></p>
<p>Damit wir ein Bild in unseren Scroll View einfügen können, benötigen wir einen Image View. Den findest Du in der Library in der Nähe des Scroll Views. Ziehe ihn auf den Scroll View,  sodass er den ganzen View bedeckt.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Image_View.png"><img class="aligncenter size-full wp-image-1135" title="UIScrollView Tutorial - Image View" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Image_View.png" alt="" width="362" height="577" /></a></p>
<p>Achte darauf, dass er <em>innerhalb</em> des Scroll Views liegt. Das kannst du im <em>Document Outline </em>links im Storyboard Editor überprüfen:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Document_Outline.png"><img class="aligncenter size-full wp-image-1137" title="UIScrollView Tutorial - Document Outline" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Document_Outline.png" alt="" width="202" height="194" /></a></p>
<p>Bis jetzt ist der Image View genauso groß wie das Display. Da wir aber wissen, dass unser Bild die Maße 320&#215;900 haben wird, können wir den Image View gleich auf diese Größe einstellen. Wähle ihn aus, indem Du im Document Outlet auf ihn klickst, und lass ihn dir im <em>Size inspector</em> anzeigen (das ist der 2. Button von rechts). Dort änderst Du den Wert über <em>Height</em> auf 900. Die Breite stimmt bereits:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Größe_des_Image_Views_ändern1.png"><img class="aligncenter size-full wp-image-1140" title="UIScrollView Tutorial - Größe des Image Views ändern" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Größe_des_Image_Views_ändern1.png" alt="" width="261" height="337" /></a></p>
<p>Jetzt müssen wir den Image View noch so hinschieben, dass seine obere Kante auf der oberen Kante des Scroll Views liegt.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Image_View_verschieben.png"><img class="aligncenter size-full wp-image-1142" title="UIScrollView Tutorial - Image View verschieben" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Image_View_verschieben.png" alt="" width="569" height="741" /></a></p>
<p>So befindet sich nämlich der obere Teil des Bildes auch im oberen Teil des Scroll Views.</p>
<p>Nun fehlt nur noch das Bild. Du kannst ein eigenes benutzen oder einfach das Beispielbild downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/Image.png.zip">Image.png</a>. Man merkt, dass ich ein wahrer Grafik-Virtuose bin <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Nachdem Du es geladen hast, ziehe es einfach vom Download-Folder in den Ordner<em> &#8221;</em>Supporting Files&#8221; im <em>Project navigator</em>. Wenn Du die Maustaste loslässt, erscheint ein Dialog. Es ist wichtig, dass dort der Haken bei &#8220;Copy items into destination group&#8217;s Folder (if needed)&#8221; gesetzt ist. Ansonsten würde nur eine Referenz der Datei erstellt werden, was später eventuell zu Problemen führt:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Bild_importieren.png"><img class="aligncenter size-full wp-image-1149" title="UIScrollView Tutorial - Bild importieren" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Bild_importieren.png" alt="" width="741" height="514" /></a></p>
<p>Klicke auf Finish um den Dialog zu schließen.</p>
<p>Jetzt, da das Bild importiert ist, ist es ganz einfach dieses in den Image View zu bekommen. Stelle sicher, dass der Image View angewählt ist und öffne den <em>Attributes inspector</em>. Gleich die erste Eigenschaft heißt <em>Image</em>. Gib dort den Namen des Bildes ein (mit Dateiendung).</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Bild_in_den_Image_View_einfügen.png"><img class="aligncenter size-full wp-image-1150" title="UIScrollView Tutorial - Bild in den Image View einfügen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Bild_in_den_Image_View_einfügen.png" alt="" width="261" height="123" /></a></p>
<p>Daraufhin erscheint das Bild auch schon im View.</p>
<p>Wenn wir die App nun einfach mal ausführen und versuchen mit einem Mauswisch zu scrollen, stellen wir fest, dass es nicht geht. Das liegt daran, dass der Scroll View nicht weiß, wie groß sein Inhalt ist, also wie weit er scrollen können muss. Um ihm das mitzuteilen, müssen wir ein paar Zeilen Code schreiben.</p>
<p><strong>3. Der Scroll View im Code</strong></p>
<p>Zuerst bleiben wir aber noch im Storyboard-Editor. Wir benötigen nämlich das Outlet des Scroll Views, damit wir mit ihm im Code arbeiten können.</p>
<p>Teile deswegen den Editor Bereich in zwei Teile (mit dem mittleren Button von <em>Editor</em> in der Tool Bar) und vergewissere dich, dass im rechten Bereich die Datei &#8220;ViewController.h&#8221; angezeigt wird. Dann klicke mit gedrückter ctrl-Taste auf den Scroll View im Document Outline und ziehst den blauene Faden unter die @interface-Zeile im Code-Editor:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial_Outlet_des_Scroll_View_erstellen1.png"><img class="aligncenter size-full wp-image-1164" title="UIScrollView Tutorial - Outlet des Scroll View erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial_Outlet_des_Scroll_View_erstellen1.png" alt="" width="911" height="287" /></a></p>
<p>Nenne das Outlet &#8220;scrollView&#8221; und klicke auf Connect.</p>
<p>Stelle die Ansicht wieder auf <em>Standard editor</em> um und öffne die Datei &#8220;ViewController.m&#8221;.<br />
Da wir die Größe des Inhalts des Scroll Views am besten noch vor dem Erscheinen des Views einstellen, bearbeiten wir die Methode <em>viewDidLoad</em>:</p>
<pre class="brush: objc; title: ; notranslate">
- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    scrollView.contentSize = CGSizeMake(320, 900);
}
</pre>
<p><em>Hinweis: Die Methode viewDidLoad wird aufgerufen, wenn der View aus dem Storyboard geladen wurde. Das ist ein günstiger Zeitpunkt, um Änderungen am View vorzunehmen.</em></p>
<p>Es ist leicht verständlich, was hier passiert. Wir setzen die <em>contentSize, </em>also die Größe des Inhalts, des Scroll Views auf die ungefähren Ausmaße des Image Views.</p>
<p>Führe die App erneut aus, um zu sehen, ob man nun scrollen kann. Wenn man jetzt mit gedrückter Maustaste die Maus bewegt, wird gescrollt. Jetzt fehlt nur noch das Zoomen.</p>
<p><strong>4. Zoomen</strong></p>
<p>Die Implementierung der Zoom-Funktion ist recht simpel. Wir benötigen allerdings das <em>UIScrollViewDelegate</em>. Dieses enthält, genauso wie bspw. das <em>UITextFieldDelegate,</em> zusätzliche Methoden. Eine davon benötigen wir.</p>
<p>Um das <em>UIScrollViewDelegate </em>einzubinden, öffne die Datei &#8220;ViewController.h&#8221; und ändere die @interface-Zeile wie folgt ab:</p>
<pre class="brush: objc; title: ; notranslate">
@interface ViewController : UIViewController &lt;UIScrollViewDelegate&gt;
</pre>
<p>Wie bei jedem Delegate müssen wir nur den Namen in spitzen Klammern hinter die Klasse schreiben. Und wie bei jedem Delegate müssen wir es noch mit einem Object im Storyboard-Editor verbinden, dem Scroll View.</p>
<p>Öffne also wieder die Datei &#8220;MainStoryboard.storyboard&#8221; und wähle den Scroll View aus. Öffne dann den <em>Connections inspector</em> und ziehe den blauen Faden von <em>delegate</em> auf das View Controller-Object im Document Outline.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Delegate_Verbindung_knüpfen.png"><img class="aligncenter size-full wp-image-1161" title="UIScrollView Tutorial - Delegate Verbindung knüpfen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Delegate_Verbindung_knüpfen.png" alt="" width="1161" height="292" /></a></p>
<p>Das Delegate wird automatisch verbunden und jetzt weiß Xcode, zu welchem Object im Storyboard das Delegate gehört.</p>
<p>Wir bleiben gleich im Storyboard-Editor, um eine weitere Einstellung vorzunehmen. Und zwar können wir ganz einfach den minimalen und maximalen Zoom im Scroll View einstellen, welche beide standardmäßig auf 1 stehen.</p>
<p>Öffne also den <em>Attributes inspector</em> und ändere die Werte bei <em>Zoom Min </em>bzw. <em>Max</em> auf -5 und 5.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Min_Max_Zoom_einstellen.png"><img class="aligncenter size-full wp-image-1162" title="UIScrollView Tutorial - Min und Max Zoom einstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Min_Max_Zoom_einstellen.png" alt="" width="259" height="403" /></a></p>
<p>Nun müssen wir noch ein weiteres Outlet erstellen, welches wir später benötigen werden. Das Outlet des Image Views.</p>
<p>Teile den Editor-Bereich wieder in zwei Teile, indem Du die Ansicht auf <em>Assistant editor</em> (wieder der mittlere Editor-Button in der Tool Bar) einstellst, und ziehe, wie beim Scroll View, den blauen Faden vom Image View in den Code-Editor unter das erste Outlet.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Image_View_Outlet_erstellen1.png"><img class="aligncenter size-full wp-image-1166" title="UIScrollView Tutorial - Image View Outlet erstellen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Image_View_Outlet_erstellen1.png" alt="" width="899" height="434" /></a></p>
<p>Gib dem Outlet den Namen <em>image </em>und klicke auf Connect. Hier sind wir fertig; stelle also wieder auf <em>Standard editor</em> um.</p>
<p>Jetzt fehlt nur noch der letzte Schritt: Die Zoom-Methode. Öffne die Datei &#8220;ViewController.m&#8221; und füge folgende Methode unter der geschweiften Klammer von <em>viewDidLoad</em> ein:</p>
<pre class="brush: objc; title: ; notranslate">
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.image;
}
</pre>
<p>In dieser Methode legen wir fest, an welches Object herangezoomt wird. Dazu geben wir das Outlet des Image Views mit der return-Anweisung zurück.</p>
<p><em>Hinweis: return &#8230;; gibt ein Objekt an diejenige Instanz &#8220;zurück&#8221;, welche die Methode aufruft. Welcher Art das zurückgegebene Objekt sein muss, steht in den runden Klammen, vorne im Funktionskopf; also bei dieser Methode &#8220;UIView&#8221;. Da ein UIImageView eine Subclass also eine &#8220;Unterkategorie&#8221;, des UIViews ist, können wir auch das image-Outlet zurückgeben. Methoden bei denen void in den Klammern steht, benötigen keine return-Anweisung.</em></p>
<p>Jetzt ist unsere App fertig. Führe sie aus, um zu sehen, ob alles funktioniert.<br />
Jetzt braucht es nur noch ein letzte Hürde zu bewältigen: Wie zoomt man im Simulator? Nun, da einem nur ein Mauszeiger zur Verfügung steht, man zum Zoomen auf dem iPhone aber zwei Finger benötigt, hat sich Apple etwas einfallen lassen. Wenn man im iOS Simulator die alt-Taste gedrückt hält, erscheinen zwei Punkte mit denen man zoomen kann.</p>
<p>(Ich kann leider bei gedrückter Alt-Taste kein Bildschrimfoto aufnehmen, deshalb habe ich versucht es nachzumachen)</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Zoomen_im_iOS_Simulator.png"><img class="aligncenter size-full wp-image-1169" title="UIScrollView Tutorial - Zoomen im iOS Simulator" src="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial-Zoomen_im_iOS_Simulator.png" alt="" width="396" height="744" /></a></p>
<p><strong>5. Schluss</strong></p>
<p>Das fertige Xcode-Projekt gibt&#8217;s wie immer zum Downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/02/UIScrollViewTutorial.zip">UIScrollView Tutorial &#8211; Scrollen und Zoomen</a></p>
<p>Dies ist ein Tutorial-Wunsch eines Lesers. Falls Du selbst eines vorschlagen möchtest, kannst du einfach ein Kommentar hinterlassen oder mich <a title="Kontakt" href="http://www.iosdevgermany.de/kontakt/">kontaktieren</a>. Allerdings kommen ziemlich viele Vorschläge rein, weshalb es immer ein wenig dauern kann bis das Tutorial schließlich rauskommt.</p>
<p>Wenn du noch irgendwelche Fragen oder Kritikpunkte hast, gib mir einfach über die Kommentarfunktion Bescheid. Möchtest Du keine weiteren Tutorials verpassen, dann abonniere einfach den <a href="http://www.iosdevgermany.de/feed">Blog RSS</a> oder folge mir auf <a href="http://twitter.com/iOsDevGermany">Twitter</a>. Wenn dir das Tutorial gefallen hat, würde ich mich freuen, wenn du es verbreitest oder mit anderen teilst.</p>
<div class="shr-publisher-1124"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/ZdzNg5OjN7w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/uiscrollview-tutorial-scrollen-und-zoomen/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/uiscrollview-tutorial-scrollen-und-zoomen/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=uiscrollview-tutorial-scrollen-und-zoomen</feedburner:origLink></item>
		<item>
		<title>Einsteiger Tutorial deutsch – Eine eigene App entwickeln</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/XLs8NBRWQCM/</link>
		<comments>http://www.iosdevgermany.de/tutorial/einsteiger-tutorial-deutsch-eine-eigene-app-entwickeln/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 16:32:59 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Anfänger]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Xcode 4.2]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=899</guid>
		<description><![CDATA[Hinweis: Das ist ein Update des Einsteiger-Tutorials, da das andere nicht mehr ganz aktuell ist. Einleitung Im App Store gibt es mittlerweile schon 500.000 Apps für iPhone, iPad und iPod touch. Das ist nicht zuletzt den vielen kleinen App Schmieden &#8230; <a href="http://www.iosdevgermany.de/tutorial/einsteiger-tutorial-deutsch-eine-eigene-app-entwickeln/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h4><em>Hinweis: Das ist ein Update des Einsteiger-Tutorials, da das andere nicht mehr ganz aktuell ist.</em></h4>
<p><strong>Einleitung</strong></p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Artikelbild1.png"><img class=" wp-image-1051 alignleft" title="Einsteiger Tutorial - Artikelbild" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Artikelbild1.png" alt="" width="317" height="293" /></a>Im App Store gibt es mittlerweile schon 500.000 Apps für iPhone, iPad und iPod touch. Das ist nicht zuletzt den vielen kleinen App Schmieden und Ein-Mann-Unternehmen zu verdanken, die ihre App-Ideen in die Tat umsetzen. Da kommt man natürlich in die Versuchung es selbst einmal zu probieren: Eine eigene App programmieren.</p>
<p>Natürlich ist es nicht so einfach, wie es jetzt vielleicht erscheint. Schon in eine kleine App muss viel Arbeit, Zeit und Nerven investiert werden, um sie App Store tauglich zu machen.</p>
<p><span id="more-899"></span></p>
<p><strong>1. Was benötige ich um eine App zu entwickeln?</strong></p>
<ul>
<li>Einen Mac: Die Software, mit welcher Apps entwickelt werden, läuft nur auf einem Macintosh Computer mit Betriebssystem Mac OS.</li>
<li>Das neueste Betriebsystem Mac OS X Lion: Nur unter diesem Betriebssystem kann mit der neuesten Version der Entwicklungsumgebung gearbeitet werden. Es wird mit jedem neuen Mac mitgeliefert.</li>
<li>Xcode: Dies ist die bereits erwähnte Entwicklungsumgebung (engl. IDE für <em>Integrated development environment</em>), also die Software mit der Apps entwickelt werden. Xcode lässt sich wie ein normales Programm im Mac App Store <strong>kostenlos</strong> laden und installieren. Mit dem Download erhältst du das komplette iOS SDK (<em>Software Development Kit)</em>, das weitere Programme, eine Dokumentation uvm. enthält.<a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial_Xcode.png"><img class="aligncenter size-full wp-image-902" title="Einsteiger Tutorial - Xcode im Mac App Store downloaden" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial_Xcode.png" alt="" width="742" height="229" /></a></li>
<li>Englischkenntnisse: Die Fachsprache der Informatik ist Englisch. Die meisten Ressourcen, Foreneinträge und auch die SDK-Dokumentation von Apple ist auf englisch. Ein gewisser Grundwortschatz ist deshalb durchaus von Nöten.</li>
</ul>
<p><strong>2. Was benötige ich nicht?</strong></p>
<ul>
<li>Ein(en) iPhone/iPad/iPod touch: Wer Apps entwickeln will hat zwar meist eine iDevice, aber diese ist dank dem <em>iPhone Simulator</em> (Genaueres gibt&#8217;s später) nicht notwendig. Ich erwähne gleich, dass man, ohne dem Apple Developer Program beigetreten zu sein, die Apps gar nicht auf seinem eigenen Gerät laufen lassen kann.</li>
<li>Das Apple Developer Program: Jeder der seine fertige App im App Store anbieten möchte, muss diesem Program beitreten. Außerdem erhält man erst so die Möglichkeit, die App auf dem eigenem Gerät zu testen. Allerdings ist diese Program für Einsteiger <strong>keine Notwendigkeit</strong>. Die eigenen Apps lassen sich ganz einfach auf einem virtuellen iPhone/iPad auf dem Mac ausführen. Ich empfehle jedem erstmal in die iOS App Entwicklung &#8220;rein zu schnuppern&#8221; und erst dann, vielleicht wenn man schon die ein oder andere kleine App programmiert hat, dem Program beizutreten, zumal dies 99$ im Jahr kostet <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</li>
</ul>
<p><strong>3. Xcode</strong></p>
<p>Bevor wir zu programmieren beginnen, sehen wir uns die IDE, Xcode, genauer an. Nachdem du sie downgeloadet und installiert hast, erscheint das Icon von Xcode, der Hammer, der auf einer blauen Zeichnung liegt, im Dock. Sobald wir das Programm öffnen erscheint ein kleines Fenster.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial_Willkomen_Fenster.png"><img class="aligncenter size-full wp-image-912" title="Einsteiger Tutorial - Willkommen Fenster" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial_Willkomen_Fenster.png" alt="" width="916" height="635" /></a></p>
<p>Auf der rechten Seite würde man später mal die aktuellsten Xcode-Projekte sehen, also die, die man zuletzt geöffnet hat. Unter &#8220;Welcome to Xcode&#8221; steht die Versions-Nummer der installierten Version. Darunter wiederum befinden sich einige Links. Ganz unten gelangt man zu Apples Developer portal, wo man online die SDK-Dokumentation und andere Ressourcen findet. Mit dem Link darüber startet der User Guide für Xcode. Interessant für uns ist vorallem der erste Link. Damit erstellen wir ein neues Xcode-Projekt. Klicke den Link an. Daraufhin öffnet sich ein größeres Fenster mit einem weiteren Dialog.</p>
<div><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Projekt_Templates2.png"><img class="aligncenter size-large wp-image-917" title="Einsteiger Tutorial - Projekt Templates" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Projekt_Templates2-1024x720.png" alt="" width="640" height="450" /></a></div>
<p>In diesem Fenster können wir ein Projekt-Template auswählen. Ein Template ist eine Vorlage, mit der wir unsere App erstellen. Soll das erste Fenster der App eine Tabelle enthalten, so wählt man das <em>Master-Detail Application</em>-Template, welches eine funktionsfähige App mit einer leeren Tabelle darstellt. In die <em>Tabbed Application</em> ist bereits eine Tab Bar eingebaut, die <em>Single View Application</em> enthält schon ein einzelnes erstes Fenster usw.</p>
<p>In der linken Seitenleiste siehst du die verschiedenen Kategorien. Diese enthalten noch weitere Templates. Die Kategorien sind unterteilt in <em>iOS</em> und <em>Mac OS X</em>. Man ist also, ohne weitere Programme zu installieren, in der Lage, nicht nur für iOS, sondern auch für Mac OS zu entwickeln. In unserem Fall bleiben wir allerdings bei iOS.</p>
<p>Für dieses Tutorial wählen wir das <em>Single View Application</em>-Template. Im nächsten Fenster können wir unserem Projekt einen Namen geben. Gib diesen bei <em>Product Name </em>ein. Es ist zwar für die App nicht von Belangen, aber ich empfehle den gleichen Product Name zu wählen wie ich, sodass die Ordner die gleichen Namen haben. Ich nenne das Projekt &#8220;Tutorial_1&#8243;. Das einzige was noch wichtig ist, ist dass bei <em>Device Family </em>der Wert auf <em>iPhone</em> steht und der Haken nur bei <em>Use Storyboard</em> und <em>Use Automatic Reference Counting </em>gesetzt ist. So oder so ähnlich sollten die Projekt-Optionen aussehen:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Projekt_Optionen.png"><img class="aligncenter size-full wp-image-924" title="Einsteiger Tutorial - Projekt Optionen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Projekt_Optionen.png" alt="" width="793" height="544" /></a></p>
<p>Klicke auf <em>Next</em> und wähle nun den Speicherort für das Projekt. Ich habe mir einen extra Ordner für die App-Entwicklung im Benutzer-Ordner angelegt, in dem ich auch alle Xcode-Projekte speichere, dass kann aber jeder selbst entscheiden. Wenn du fertig bist, klicke auf <em>Create</em>.</p>
<p>Jetzt ist das Projekt erstellt und wir können nun mit Xcode arbeiten.</p>
<p>Sehen wir uns den IDE genauer an:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Xcode_Aufbau_1.png"><img class="aligncenter size-large wp-image-932" title="Einsteiger Tutorial - Xcode Aufbau 1" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Xcode_Aufbau_1-1024x720.png" alt="" width="640" height="450" /></a></p>
<ol>
<li>Das ist die linke Seitenleiste. Am oberen Rand dieser Leiste findest du 7 verschiedene Buttons. Alle stehen für einen <em>navigator</em>. Wählst du einen anderen Button, erscheint ein anderer navigator. Der erste Button ist für den <em>Project navigator</em> (die Funktion eines Buttons wird sichtbar, wenn du mit der Maus auf ihm verweilst). Im <em>Project navigator</em> siehst du, aus welchen Dateien unser Xcode-Projekt aufgebaut ist. Ganz oben befindet sich die <em>Projekt-Datei</em>. Diese enthält den für uns wichtigsten Ordner, mit dem Namen &#8220;Tutorial_1&#8243;. In ihm liegen alle Dateien, mit denen wir beim Programmieren hauptsächlich arbeiten.<br />
Im <em>Project navigator </em>können wir also Dateien auswählen. Zu den anderen <em>navigators </em>komme ich zu gegebener Zeit.</li>
<li>Das ist der Editor-Bereich. Hier können die im <em>Project navigator</em> ausgewählten Dateien bearbeitet werden. Je nach Dateityp sieht dieser Bereich anders aus. Ein Blick in die Seitenleiste bzw. auf den oberen Rand des Fenster zeigt uns, dass die Projekt-Datei &#8220;Tutorial_1.xcodeproj&#8221; ausgewählt ist. Allerdings werden wir an dieser Datei vorerst nichts ändern. Deshalb öffne einfach mal die Datei &#8220;MainStoryboard.storyboard&#8221;. Im Editor-Bereich erscheint nun der sogenannte <em>Storyboard-Editor</em>.</li>
</ol>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Xcode_Aufbau_2.png"><img class="aligncenter size-large wp-image-935" title="Einsteiger Tutorial - Xcode Aufbau 2" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Xcode_Aufbau_2-1024x720.png" alt="" width="640" height="450" /></a>3.   Die rechte Seitenleiste: Genauso wie der Editor-Bereich sieht die rechte                  Seitenleiste je nach angewählter Datei anders aus. Sie wird hauptsächlich bei Dateien mit der Endung .storyboard benötigt, also wenn der Storyboard-Editor geöffnet ist (wie im Bild gezeigt).<br />
Sie ist in zwei Teile unterteilt: Unten befindet sich die Library, oben die verschiedenen <em>inspectors</em>. Die Library enthält Objekte, mit denen wir das Aussehen, das <em>Interface</em>, der App basteln können (was wir später auch tun werden). Dazu zieht man die <em>Objects</em> aus der Library in den Storyboard-Editor. Dann können diese <em>Objects</em> in den inspectors bearbeitet werden.<br />
4.  Am oberen Rand des Fenster befindet sich die <em>Toolbar</em>. Sie enthält verschiedene Buttons, auf die man schnell Zugriff haben will. Die genaueren Funktionen der Buttons werde ich zu gegebener Zeit erläutern.</p>
<p>Wie ich weiter oben bereits erklärt habe, ist ein Template schon eine funktionsfähige App. Da wir das <em>Single View Application</em>-Template gewählt haben, enthält unsere App bereits ein erstes leeres Fenster. Bevor wir also zu programmieren beginnen, führen wir die unveränderte App einfach mal aus. Hier kommt nun der <em>iPhone-Simulator</em> ins Spiel. Um die App testen zu können verwenden wir kein echtes iPhone, sondern ein virtuelles auf dem Bildschirm unseres Computers. Um die App zu starten, klicken wir in der Toolbar auf den Button mit dem schwarzen Dreieck, unter dem <em>Run</em> steht. Jetzt wird das Projekt kompiliert. Das bedeutet der Code wird in Computer-Sprache übersetzt und dann eine richtige iPhone-App daraus gemacht. Den Fortschritt des <em>Compilers </em>(das was kompiliert) sehen wir in dem kleinen blau-grauen Fenster in der Toolbar. Ist er fertig so öffnet sich ein weiteres Programm, der Simulator:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-iPhone_Simulator.png"><img class="aligncenter size-full wp-image-943" title="Einsteiger Tutorial - iPhone Simulator" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-iPhone_Simulator.png" alt="" width="396" height="744" /></a></p>
<p>Wie Du siehst besitzt diese App noch keinerlei Funktion. Klicke mit der Maus auf den Home Button um die App zu beenden. Der iOS Simulator sieht nicht nur wie ein iPhone aus, sondern hat auch ähnliche Funktionen. Wir können mit einer Wischgeste durch den Home-Bildschrim navigieren oder könnten sogar mit Safari ins Internet gehen. Nun aber beginnen wir erstmal damit, unserer App eine Funktion zu verleihen. Dazu begeben wir uns zurück zu Xcode und klicken in der Toolbar auf den Button mit dem kleinen, schwarzen Quadrat, um die App ganz zu beenden.</p>
<p><strong>4. Das Interface gestalten</strong></p>
<p>Jede App besteht aus Objekten, mit denen der User agieren kann. Sie bilden das Interface, also das Aussehen. Das können Buttons, Textfelder, uvm. sein. Diese Objekte habe ich bereits angesprochen, als es um die Library in der rechten Seitenleiste ging. Jetzt wollen wir diese verwenden um das Interface unserer App zu erstellen.</p>
<p>Die App soll eine ganz banale Funktion haben. Der User gibt in ein Textfeld seinen Namen ein, klickt auf einen Button und wird höflich begrüßt.</p>
<p>Das Interface einer App wird einer <em>Storyboard-Datei </em>bearbeitet. Diese ist bereits geöffnet:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Storyboard_Editor.png"><img class="aligncenter size-large wp-image-949" title="Einsteiger Tutorial - Storyboard Editor" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Storyboard_Editor-1024x720.png" alt="" width="640" height="450" /></a></p>
<p>Hier sehen wir auch gleich das bisherige Aussehen der App: ein weißer Bildschirm. Genau dieser wurde gezeigt, als die App im iOS-Simulator lief. Dieser weiße Bildschirm, den wir im Editor sehen, ist ein sogenannter <em>View</em>. Dieser View wird in einem <em>View Controller</em> aufbewahrt. Unter dem weißen View ist eine schwarze Leiste, das <em>Dock</em>, in dem die Art des Controllers steht. Dieser ist ein View Controller, also ein Controller der einen View enthält (es gibt noch andere Controller). Der (View) Controller bildet zusammen mit einem oder mehreren anderen Objekten, die erstmal nicht wichtig sind, eine <em>Scene.</em>  Die meisten Apps enthalten mehr als nur eine Scene. Da gibt es dann eine Scene für das Hauptmenü, darüber gelangt man zum Beispiel zu einer Scene mit einer Tabelle und von dieser in eine Scene mit weiteren Informationen. Damit man nicht den Überblick verliert, gibt es das <em>Document Outline</em>, das sich auf der linken Seite des Editor-Bereichs, rechts neben der linken Seitenleiste, befindet. Im Document Outline werden alle Scenes untereinander angezeigt. Wenn wir uns die bisherige Scene einmal genauer anschauen, wird der Aufbau dieser noch einmal klarer:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Eine_Scene_im_Document_Outline.png"><img class="aligncenter size-full wp-image-952" title="Einsteiger Tutorial - Eine Scene im Document Outline" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Eine_Scene_im_Document_Outline.png" alt="" width="200" height="135" /></a></p>
<p>Die &#8220;View Controller Scene&#8221; wird unterteilt in ein <em>First Responder Objekt</em> (meist nicht wichtig) und den View Controller. Klickt man auf den kleinen grauen Pfeil neben dem View Controller, so wird der View sichtbar, den er enthält.</p>
<p>So jetzt geht&#8217;s los. Unsere App soll aus einem Textfeld, einem Button und einem Text bestehen. All diese Objects finden wir in der Library. Scrolle runter bis du das Object <em>Text Field</em> siehst. Für mehr Übersicht kannst du die Library etwas vergrößern:</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Objects_in_der_Library.png"><img class="aligncenter  wp-image-954" title="Einsteiger Tutorial - Objects in der Library" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Objects_in_der_Library.png" alt="" width="200" height="580" /></a></p>
<p style="text-align: left;">Ziehe es aus der Library in den View im Editor-Bereich. Mache das gleiche mit eine <em>Round Rect Button</em> und einem <em>Label:</em></p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-View_mit_einigen_Objects.png"><img class="aligncenter size-full wp-image-956" title="Einsteiger Tutorial - View mit einigen Objects" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-View_mit_einigen_Objects.png" alt="" width="423" height="601" /></a></p>
<p style="text-align: left;">Um die Objects anzuordnen, ziehen wir sie einfach an den gewünschten Platz. Blaue Linien helfen dabei, die Mitte bzw. den empfohlenen Abstand zum Rand des Views zu finden. Ordne die Objects wie folgt an:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Objects_anordnen.png"><img class="aligncenter size-full wp-image-958" title="Einsteiger Tutorial - Objects anordnen" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Objects_anordnen.png" alt="" width="388" height="594" /></a></p>
<p style="text-align: left;">Alle drei Objects sind leider noch etwas zu klein. Klicke deshalb zuerst den Button einmal an, sodass kleine Anfasser erscheinen. Ziehe ihn ein bisschen nach links in die Länge. Als nächstes wählst Du das Textfeld aus und ziehst es bis zum empfohlenen Abstand vom Rand. Das gleiche machst du mit dem Label.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Objects_vergroessern.png"><img class="aligncenter size-full wp-image-959" title="Einsteiger Tutorial - Objects vergrößern" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Objects_vergroessern.png" alt="" width="366" height="589" /></a></p>
<p style="text-align: left;">So weit so gut. Zunächst wollen wird das Textfeld ein bisschen abändern. Klicke es dazu einmal an. Jetzt kommt zum ersten Mal ein <em>inspector</em> ins Spiel. Klicke in der rechten Seitenleiste auf den vierten Button von links. Der <em>Attributes inspector</em> wird angezeigt.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Der_Attributes_inspector1.png"><img class="aligncenter size-full wp-image-963" title="Einsteiger Tutorial - Der Attributes inspector" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Der_Attributes_inspector1.png" alt="" width="269" height="561" /></a></p>
<p style="text-align: left;">Je nachdem welches Object im View ausgewählt ist, können hier andere Einstellungen bearbeitet werden. Den Wert, den wir beim Textfeld abändern möchten, ist der des <em>Placeholders</em>. Der Placeholder ist ein Text, der bevor etwas eingegeben wird schon im Textfeld steht und bei der Eingabe verschwindet. Schreibe als Wert &#8220;Gib hier deinen Namen ein&#8221; hinein. Jetzt ist im Textfeld im View schwach der Text zu sehen.</p>
<p style="text-align: left;">Zunächst ändern wir noch den Text des Labels. Wir könnten dies, wie beim Textfeld, im Attributes inspector bewerkstelligen, allerdings geht es beim Label auch einfacher. Klicke doppelt auf das Label und gib den folgenden Text ein: &#8220;Wie heißt du?&#8221;. Genauso funktioniert auch das Beschriften des Buttons. Nenne den Button &#8220;Fertig&#8221;.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Das_fertige_Interface.png"><img class="aligncenter size-full wp-image-965" title="Einsteiger Tutorial - Das fertige Interface" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Das_fertige_Interface.png" alt="" width="366" height="581" /></a></p>
<p style="text-align: left;">Führen wir nun die App noch einmal aus. Klicke dazu wieder auf den Run-Button. Wir können sogar schon etwas in das Textfeld eingeben. Wenn wir auf den Button klicken, passiert allerdings noch nichts. Das werden wir gleich ändern&#8230;</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_bisherige_App.png"><img class="aligncenter size-full wp-image-969" title="Einsteiger Tutorial - Die bisherige App" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_bisherige_App.png" alt="" width="396" height="744" /></a></p>
<p style="text-align: left;">Damit ist das Interface unserer App fertig. Jetzt geht&#8217;s ans Programmieren.</p>
<p style="text-align: left;"><strong>5. Eine funktionierende App programmieren</strong></p>
<p style="text-align: left;">Was jetzt noch fehlt ist, dass etwas passiert wenn man den Button drückt. Dazu erstellen wir eine Methode im Code. Diese Methode wird also aufgerufen, wenn der Button gedrückt wird und führt dann eine Reihe von Befehlen aus. Da in dieser Methode das Label und das Textfeld vorkommen, müssen wir diese Objects im Code repräsentieren. Dazu verwendet man ein Outlet. Ändert man im Code etwas am Outlet, so ändert sich im MainStoryboard etwas am Object des Views. Erstellen wir also zuerst die zwei Outlets.</p>
<p style="text-align: left;">Wir bleiben dazu in der Datei MainStoryboard.storyboard. Allerdings teilen wir den Editorbereich in zwei Teile. Dazu benötigen wir einen weiteren Button in der Toolbar, den Button für den <em>Assistant editor</em>.</p>
<p style="text-align: center;"><img class="size-full wp-image-970 aligncenter" title="Einsteiger Tutorial - Der Assistant editor Button" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Der_Assistant_editor_Button.png" alt="" width="94" height="55" /></p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Assistant_editor2.png"><img class="aligncenter size-large wp-image-973" title="Einsteiger Tutorial - Assistant editor" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Assistant_editor2-1024x720.png" alt="" width="640" height="450" /></a>Um trotz der zwei Teile alles im Blickfeld zu haben, kannst du das Xcode-Fenster größer ziehen oder mit dem Button in der rechten oberen Ecke in den Vollbildmodus wechseln.</p>
<p style="text-align: left;">Auf der rechten Seite im Editor-Bereich ist der Code-Editor geöffnet. Er zeigt die Datei &#8220;ViewController.h&#8221;. Diese Datei gehört zur Scene, die wir vorhin im Storyboard-Editor bearbeitet haben und die jetzt auf der linken Seite zu sehen ist. Die Dateien &#8220;ViewController.h&#8221; und &#8220;ViewController.m&#8221; stellen also den Code einer Scene dar. Bei mehreren Scenes braucht man auch mehrere Dateien.<br />
Um jetzt die Outlets des Textfeldes und des Labels zu erstellen, benötigen wir wieder das <em>Document Outline</em>. Dir ist vielleicht schon aufgefallen, das innerhalb des View-Objects jetzt die drei anderen Objects erschienen sind. Um das Outlet des Labels zu erstellen, klickst du mit gedrückter ctrl-Taste auf das Label im Document Outlet und ziehst den erscheinenden blauen Faden in den Code-Editor, über die Zeile @end. Das Bild zeigt das nochmal:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Outlet_erstellen_11.png"><img class="aligncenter size-large wp-image-978" title="Einsteiger Tutorial - Outlet erstellen 1" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Outlet_erstellen_11-1024x640.png" alt="" width="640" height="400" /></a></p>
<p style="text-align: left;">Daraufhin erscheint eine kleine Sprechblase, in der wir nur den Namen des Outlets angeben müssen. Nenne es &#8220;label&#8221;. Achte darauf, dass du &#8220;label&#8221; klein schreibst! Klicke dann auf <em>Connect</em>.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Outlet_erstellen_2.png"><img class="aligncenter size-full wp-image-979" title="Einsteiger Tutorial - Outlet erstellen 2" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Outlet_erstellen_2.png" alt="" width="691" height="236" /></a></p>
<p style="text-align: left;">Wiederhole diese Schritte  beim Textfeld und nenne das Outlet &#8220;textfield&#8221; (Achtung: englisch).</p>
<p style="text-align: left;">Die Datei ViewController.h sollte dann so aussehen:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_Outlets.png"><img class="aligncenter size-full wp-image-980" title="Einsteiger Tutorial - Die Outlets" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_Outlets.png" alt="" width="510" height="304" /></a></p>
<p style="text-align: left;">Dass die Verbindungen zwischen diesen Outlets und den Objects im Storyboard wirklich existieren, können wir im <em>Connections inspector</em> sehen. Wähle zuerst den View Controller aus, indem du auf das schwarze Dock klickst und klicke dann auf den letzten Button in der rechten Seitenleiste für den <em>Connections inspector</em>.</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Der_Connections_inspector.png"><img class="aligncenter size-large wp-image-984" title="Einsteiger Tutorial - Der Connections inspector" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Der_Connections_inspector-1024x453.png" alt="" width="640" height="283" /></a></p>
<p style="text-align: left;">Dort sieht man, dass eine Verbindung zwischen <em>textfield</em> im Code und <em>Text Field &#8211; &#8230;</em> in MainStoryboard.storyboard existiert. Das gleich beim Label. Damit sind die Outlets fertig.</p>
<p style="text-align: left;">Jetzt kommen wir zur Methode, die aufgerufen werden soll, wenn der Button gedrückt wird. Eine Methode ist wie gesagt eine Aneinanderreihung von Befehlen. Die Befehle, die in unserer Methode ausgeführt werden, sind zuerst den Namen des Users im Textfeld zu ermitteln und ihn dann in eine Begrüßungsformel wie &#8220;Herzlich Willkommen [hier wird der Name eingefügt]!&#8221; einzufügen. Dann wird dieser Begrüßungstext dem Text-Label zugewiesen, sodass es die Begrüßung anzeigt.</p>
<p style="text-align: left;">Im MainStoryboard.storyboard gibt es für jeden Button eine Event, der aufgerufen wird, wenn dieser Button gedrückt wird. Diesen Event müssen wir, wie bei den Objects, im Code repräsentieren. Um dies zu tun, bleiben wir gleich im <em>Assistant editor</em>-Modus. In der rechten Seitenleiste sollte weiterhin der Connections inspector angezeigt werden. Wähle dann den Button im View aus. Eine Unterteilung im Connection inspector heißt &#8220;Sent Events&#8221; und darunter finden wir den Event &#8220;Touch Up Inside&#8221;. Klicke in den kleinen Kreis rechts daneben und ziehe den blauen Faden wieder in den Code-Editor, über @end aber unter die Outlets:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Action_und_Event2.png"><img class="aligncenter size-large wp-image-990" title="Einsteiger Tutorial - Action und Event" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Action_und_Event2-1024x405.png" alt="" width="640" height="253" /></a></p>
<p style="text-align: left;">Wir nennen unsere Methode <em>doneButtonPressed</em>. Und das war&#8217;s auch schon. Sobald der Button den Event <em>Touch Up Inside</em> erfährt, ruft er unsere Methode <em>doneButtonPressed</em> auf. Jetzt fehlt nur noch, dass wir angeben, was in dieser Methode passiert.</p>
<p style="text-align: left;">Zunächst aber verlassen wir den <em>Assistant editor-</em>Modus und wählen wieder den <em>Standard editor;</em> das ist der Button links daneben.</p>
<p style="text-align: left;">Öffne jetzt die Datei &#8221;ViewController.<strong>m</strong>&#8220;. Dort befindet sich bereits unsere Methode, ganz unten, am Ende der Datei:</p>
<p style="text-align: left;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Unsere_Methode.png"><img class="aligncenter size-full wp-image-993" title="Einsteiger Tutorial - Unsere Methode" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Unsere_Methode.png" alt="" width="819" height="385" /></a></p>
<p style="text-align: left;">Noch ist sie leer, das werden wir aber gleich ändern. Ersetze die Methode (im Bild das Rotmarkierte) durch Folgendes:</p>
<pre class="brush: objc; title: ; notranslate">
- (IBAction)doneButtonPressed:(id)sender {
    NSString *textfieldText = textfield.text;
    NSString *helloMessage = [NSString stringWithFormat:@&quot;Herzlich Willkommen %@&quot;, textfieldText];
    label.text = helloMessage;
    textfield.text = NULL;
}
</pre>
<ul>
<li>Zeile 2: <em>NSString</em> ist eine Variable, in der Text gespeichert werden kann. Wir speichern in der Variable <em>textfieldText</em> von ebendiesem Typ den Namen aus dem Textfeld.</li>
<li>Zeile 3: Dann erstellen wir einen weiteren NSString, der den gesamten Begrüßungstext darstellt. In die Zeichenkette &#8220;%@&#8221; wird die dahinterstehende Variable, textfieldText, eingesetzt.</li>
<li>Zeile 4: Der Text wird dem Label zugewiesen.</li>
<li>Zeile 5: Der eingegebene Name wird aus dem Textfeld wieder gelöscht.</li>
</ul>
<p>Die Methode ist fertig und der Fertig-Button damit funktionstüchtig. Probieren wir die App erneut aus. Starte sie über den Run-Button. Nebenbei erwähnt: Du kannst zum Eingeben deines Namens auch die Tastatur deines Computers verwenden.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_App_mit_funktionierendem_Button1.png"><img class="aligncenter size-full wp-image-999" title="Einsteiger Tutorial - Die App mit funktionierendem Button" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_App_mit_funktionierendem_Button1.png" alt="" width="396" height="744" /></a></p>
<p>Ganz fertig sind wir aber noch nicht. Versucht der User die Tastatur über <em>return </em>zu schließen, so tut sich nichts. Das liegt daran, dass wir dem Textfeld nicht gesagt haben, dass es die Tastatur bei <em>return</em> schließen soll.</p>
<p>Bevor wir weiterarbeiten sollten/könnten wir die App noch mit dem &#8220;Stop&#8221;-Button in der Toolbar beenden. Das möchte ich nun aber absichtlich <strong>nicht</strong> tun, um zu zeigen, dass es auch so funktioniert. Kehre einfach zu Xcode zurück, um weiterzumachen.</p>
<p>Damit die <em>return-</em>Taste funktioniert, benötigen wir eine weitere Methode. Diese unterscheidet sich ein wenig von der Methode <em>doneButtonPressed:. </em>In wiefern sehen wir gleich.</p>
<p>Öffne zuerst die Datei &#8220;ViewController.h&#8221;.  Dort befindet sich die Deklaration der Methode <em>doneButtonPressed:</em>. Bei der Deklaration wird der Name der Methode festgelegt. Vorhin haben wir diese dann in &#8220;ViewController.m&#8221; definiert, indem wir angegeben haben, was in ihr passiert. Die Methode zum Schließen der Tastatur, sie heißt <em>textFieldShouldReturn:</em>, muss auch deklariert und definiert werden. Allerdings ist dies eine Methode die uns Apple vorgegeben hat und der Apple bereits einen Namen gegeben, also sie deklariert, hat. Und zwar fand die Deklaration im <em>TextFieldDelegate</em> statt. Ein Delegate ist eine Sammlung von Methoden, die wir verwenden können und sie so abändern, dass sie unseren Ansprüchen genügt. Das heißt definieren müssen <em>wir</em> diese Methode, deklariert ist sie schon. Damit Xcode bei der Definition weiß, wo <em>textFieldShouldReturn</em> deklariert wurde, müssen wir dieses Delegate in unsere ViewController-Dateien einbinden. Das machen wir indem wir hinter die Zeile @interface ViewController : UIViewController noch etwas dazuschreiben:</p>
<pre class="brush: objc; title: ; notranslate">
&lt;UITextFieldDelegate&gt;
</pre>
<p>Jetzt können wir die Methode definieren. Öffne dazu wieder die Datei &#8220;ViewController.m&#8221;.<br />
Füge den folgenden Code direkt über @end ein bzw. nach der schließenden geschweiften Klammer von doneButtonPressed:</p>
<pre class="brush: objc; title: ; notranslate">
-(BOOL) textFieldShouldReturn:(UITextField *)textField {
    if (textField == self.textfield) {
        [textField resignFirstResponder];
    }
    return TRUE;
}
</pre>
<p>Neben dem Methodennamen <em>textFieldShouldReturn:</em> befindet sich ein sogenanntes Argument. Dieses heißt ähnlich wie unser Textfield-Outlet <em>textfield</em>, ist aber nicht das selbe. Beim Aufruf der Methode, wenn der Return-Button gedrückt wird, wird in dieser Variable gespeichert, zu welchem Textfeld die Tastatur gehört. Dann können wir mit einer if-Bedingung überprüfen, ob die Methode von unserem Textfeld aufgerufen wurde (eigentlich ist das in unserem Fall hinfällig, da wir nur ein Textfeld haben). Dann rufen wir mit der Variable <em>textField</em> die Methode <em>resignFirstResponder</em> auf, welche die Tastatur schließt. Mit <em>return TRUE</em> geben wir an, dass alles einwandfrei geklappt hat. Damit haben wir die Methode definiert.</p>
<p>Zuletzt müssen wir Xcode noch im Storyboard mitteilen, bei <em>welchem</em> Textfeld die Tastatur bei return geschlossen werden soll. Das machen wir, indem wir das TextfieldDelegate mit dem Textfeld verbinden. Dazu benötigen wir wieder die Datei für das Interface, MainStoryboard.storyboard.</p>
<p>Wähle im Editor das Textfeld aus und lass es dir im <em>Connections inspector</em> anzeigen:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Delegate_1.png"><img class="aligncenter size-full wp-image-1016" title="Einsteiger Tutorial - Delegate 1" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Delegate_1.png" alt="" width="955" height="505" /></a></p>
<p>Jetzt kommt etwas, das so ähnlich ist wie das, was wir schonmal gemacht haben. Wir verbinden etwas aus dem Storyboard mit etwas im Code: Wie du siehst gibt es im <em>Connections inspector</em> einen Unterpunkt namens <em>delegate. </em>Dieses <em>delegate</em> vom Textfeld können wir mit dem <em>UITextFieldDelegate</em> verbinden. Ziehe den blauen Faden dafür auf das View Controller Objekt, wie du es hier im Bild siehst:</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Delegate_2.png"><img class=" wp-image-1017 aligncenter" title="Einsteiger Tutorial - Delegate 2" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Delegate_2-1024x597.png" alt="Das Delegate im Storyboard mit dem Delegate im Code verbinden." width="640" height="373" /></a></p>
<p>Damit sind wir schlussendlich fertig mit der App. Jetzt wollen wir sie erneut ausführen. Wie gesagt wollten wir ausprobieren, was passiert, wenn man die App nicht stoppt, nachdem man im Simulator fertig ist. Starte sie mit einem Klick auf Run.</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Run.png"><img class="size-full wp-image-1021 aligncenter" title="Einsteiger Tutorial - Run" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Run.png" alt="" width="115" height="81" /></a></p>
<p>Daraufhin erscheint ein kleines Fenster unter der Toolbar:</p>
<p style="text-align: center;"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Stop_Meldung.png"><img class="size-full wp-image-1022 aligncenter" title="Einsteiger Tutorial - Stop Meldung" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Stop_Meldung.png" alt="" width="448" height="178" /></a></p>
<p>Klicke auf Stop, um die App normal auszuführen.</p>
<div id="attachment_1023" class="wp-caption aligncenter" style="width: 406px"><a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_fertige_App.png"><img class="size-full wp-image-1023" title="Einsteiger Tutorial - Die fertige App" src="http://www.iosdevgermany.de/wp-content/uploads/2012/01/EinsteigerTutorial-Die_fertige_App.png" alt="" width="396" height="744" /></a><p class="wp-caption-text">In der fertigen App lässt sich nach der Eingabe die Tastatur schließen.</p></div>
<p><strong>5. Zusammenfassung</strong></p>
<p>Fassen wir nochmal grob zusammen, was Du in diesem Tutorial gelernt hast:</p>
<ul>
<li>Im Storyboard kannst Du das Interface der App bearbeiten</li>
<li>Um im Code mit einem <em>Object</em> aus dem Storyboard zu arbeiten, musst du davon ein Outlet erstellen</li>
<li>Mit dem Event T<em>ouch Up Inside </em>und einer passenden Methode können wir festlegen, was passiert, wenn ein Button gedrückt wird</li>
<li>Damit sich die Tastatur eines Textfeldes bei return schließt, benötigen wir eine Methode aus dem <em>UITextFieldDelegate</em> namens <em>textFieldShouldReturn:</em></li>
</ul>
<p><strong>6. Schluss</strong></p>
<p>Das Xcode Projekt der App kannst du hier downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2012/01/Einsteiger_Tutorial_deutsch-Eine_Eigene_App.zip">Einsteiger_Tutorial_deutsch-Eine_Eigene_App</a>. Wirf nochmal einen Blick darauf, falls Du dir nicht sicher bist, wo welches Codeschnipsel hingehört.</p>
<p>Jetzt hast du deine erste eigene App programmiert. Mit einer kleinen App wie diesen fängt jeder Entwickler einmal an. Ich werde diese Tutorial-Serie fortführen und später auch fortgeschrittenere Themen behandeln.</p>
<p>Wenn du noch irgendwelche Fragen, Vorschläge oder Kritikpunkte hast, kannst Du mir gerne ein Kommentar hinterlassen. Möchtest Du keine weiteren Tutorials verpassen, so abonniere einfach den <a href="feed://feeds.feedburner.com/iosdevgermany">Blog RSS </a> oder folge mir auf <a href="https://twitter.com/#!/iOsDevGermany">Twitter</a>. Wenn dir das Tutorial gefallen hat, kannst du es gerne verbreiten und mit anderen teilen.</p>
<div class="shr-publisher-899"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/XLs8NBRWQCM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/einsteiger-tutorial-deutsch-eine-eigene-app-entwickeln/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/einsteiger-tutorial-deutsch-eine-eigene-app-entwickeln/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=einsteiger-tutorial-deutsch-eine-eigene-app-entwickeln</feedburner:origLink></item>
		<item>
		<title>iPhone SDK Tutorial deutsch 6 – Storyboard Part 2 – Table View</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/GaZhEv-SIKI/</link>
		<comments>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 09:54:30 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[UITableView]]></category>
		<category><![CDATA[Xcode 4.2]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=861</guid>
		<description><![CDATA[Hier ist Part 2 des Storyboard Tutorials in Xcode 4.2. Im letzten Tutorial haben wir schon die ersten View Controller erstellt und diese miteinander verbunden. Diesmal werden wir einen Table View Controller hinzufügen. Leider kommen wir in diesem Part nicht &#8230; <a href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Hier ist Part 2 des Storyboard Tutorials in Xcode 4.2. Im letzten Tutorial haben wir schon die ersten View Controller erstellt und diese miteinander verbunden. Diesmal werden wir einen Table View Controller hinzufügen. Leider kommen wir in diesem Part nicht ganz ohne eine Zeile Code aus <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Dieser Part baut übrigens direkt auf Part 1 auf, also solltest du diesen vorher gelesen haben: <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 1 – Grundlagen" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen/">iPhone SDK Tutorial deutsch 6 &#8211; Storyboard Part 1 &#8211; Grundlagen</a></p>
<p><span id="more-861"></span></p>
<p><strong>1. Das alte Projekt öffnen</strong></p>
<p>Du kannst für dieses Tutorial einfach das Projekt des letzen Tutorials weiterverwenden. Wenn du dieses nicht mehr hast, kannst du es hier downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/iPhone_SDK_Tutorial_deutsch_6-Storyboard_Part_1-Grundlagen.zip">iPhone_SDK_Tutorial_deutsch_6-Storyboard_Part_1-Grundlagen</a><br />
Öffne die Projekt-Datei (z.B. &#8220;Tutorial6.xcodeproj&#8221;) in Xcode.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-DasStoryboard.png"><img class="aligncenter size-medium wp-image-835" title="Tutorial 6 - Projekt öffnen" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-DasStoryboard-300x131.png" alt="" width="300" height="131" /></a></p>
<p><strong>2. Table View Controller hinzufügen</strong></p>
<p>Das letzte Mal haben wir schon einen normalen View Controller hinzugefügt. Den können wir nun leider nicht mehr gebrauchen. Wähle ihn also an (den ganz rechten), indem du das schwarze Dock anklickst, und drücke die Backspace-Taste um ihn zu entfernen. Als nächstes fügen wir den Table View Controller hinzu. Ziehe also das <em>Table View Controller</em>-Object aus der Library neben den Hauptmenü-View-Controller. Jetzt verbinden wir die beiden Controller, indem wir wieder mit gedrückter ctrl-Taste auf den <em>Spieler-Liste</em>-Button im Hauptmenü-View-Controller klicken und den blauen Faden auf den Table View Controller ziehen.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-ControllerVerbinden.png"><img class="aligncenter size-full wp-image-866" title="Tutorial 6.2 - Controller verbinden" src="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-ControllerVerbinden.png" alt="" width="793" height="579" /></a></p>
<p>Im erscheinende kleinen, schwarzen Fenster wählst du Push. Wie schon in Part 1 bleibt der Navigation Controller damit erhalten. Damit alles übersichtlich bleibt, ändern wir den Titel der Navigation Bar im Table View Controller auf &#8220;Spieler-Liste&#8221;, indem wir die Navigation Bar dort doppelt klicken. Führe die App nun einmal aus, um zu sehen, ob der Wechsel zwischen den Views einwandfrei funktioniert.</p>
<p><strong>3. Prototype Cells</strong></p>
<p>Jetzt füllen wir unsere Tabelle mit Inhalt. Dazu verwenden wir einen vorgegebenen Zellenstil. Bevor wir dies allerdings tun, sehen wir nach, warum uns Xcode eine Warnung anzeigt. Klicke dazu auf das gelbe Dreieck im kleinen grauen Fenster in der Toolbar</p>
<p><img class="aligncenter size-full wp-image-869" title="Tutorial 6.2 - Warnungssymbol" src="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-WarnungsSymbol.png" alt="" width="398" height="58" /></p>
<p>Daraufhin erscheint in der linken Seitenleiste die Warnung.</p>
<p><img class="aligncenter size-full wp-image-871" title="Tutorial 6.2 - Warnung" src="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-Warnung1.png" alt="" width="258" height="74" /></p>
<p><strong>&#8220;Unsupported Configuration &#8211; Prototype table cells must have reuse identifiers&#8221;</strong></p>
<p>Die Warnung bedeutet, dass wir eine Table View mit Table View Cells benutzen, ohne diese Cells richtig konfiguriert zu haben.<br />
Um dies zu ändern wähle die einzige Zeile in der Table View an und lass sie dir im Attributes inspector anzeigen. Zuerst setzen wir den <em>Style</em> auf <em>Basic</em> und wählen bei <em>Accessory</em> den <em>Detail Disclosure. </em>Wichtig ist, und darüber hat sich Xcode beschwert, dass wir den <em>Identifier</em> setzen. In unserem Beispiel nennen wir die Zelle <em>PlayerCell</em>. Mit Hilfe dieser Zellenbezeichnung können wir die Zelle immer wieder verwenden, ohne sie neu konfigurieren zu müssen (<strong><em>Reuse</em></strong><em> Identifier</em>). <a href="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-ZelleKonfigurieren.png"><img class="aligncenter size-full wp-image-872" title="Tutorial 6.2 - Zelle konfigurieren" src="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-ZelleKonfigurieren.png" alt="" width="655" height="645" /></a></p>
<p>Damit sollte die Warnung verschwunden sein und wir können die App nochmal ausführen, um zu testen, ob alles noch funktioniert. Geändert haben sollte sich nichts.</p>
<p><strong>4. Die Data Source</strong></p>
<p>Jetzt wird die Zelle mit dem eigentlichen Inhalt gefüllt. Dazu müssen wir zunächst zwei neue Dateien anlegen. Klicke mit der rechten Maustaste auf den Projektordner &#8220;Tutorial6&#8243; in der linken Seitenleiste und wähle die Option &#8220;New File&#8230;&#8221;. Im erscheinenden Fenster wählst du <em>Objective-C class</em> in der Kategorie iOS&#8211;&gt;Cocoa Touch. Nenne sie &#8220;PlayerlistViewController&#8221; und beachte, dass <em>Subclass of UITableViewController </em>ausgewählt ist. Der Haken bei <em>With XIB for user interface</em> sollte nicht gesetzt sein, da wir ja mit dem Storyboard arbeiten.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2NeueDatei.png"><img class="aligncenter size-full wp-image-877" title="Tutorial 6.2 Neue Datei" src="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2NeueDatei.png" alt="" width="731" height="494" /></a></p>
<p>Nun müssen wir noch festlegen, zu welchem View Controller im Storyboard die Dateien gehören. Öffne dazu die Datei &#8220;MainStoryboard.storyboard&#8221; und wähle den Table View Controller aus. Im identity Inspector geben wir bei <em>Class</em> den Namen der eben erstellten View-Controller-Dateien ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-ClassDesTableViewControllers.png"><img class="aligncenter size-full wp-image-878" title="Tutorial 6.2 - Class des Table View Controllers" src="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2-ClassDesTableViewControllers.png" alt="" width="261" height="204" /></a></p>
<p>Wie gewohnt erstellen wir ein Array, um die Tabelledaten zu verwalten. Öffne die Datei <em>PlayerlistViewController.h</em> und schreibe unter die @interface-Zeile folgendes:</p>
<pre class="brush: objc; title: ; notranslate">
@property (nonatomic, strong) NSMutableArray *playerList;
</pre>
<p>Das einzig neue ist hier das <em>strong</em> nach <em>nonatomic, </em>statt <em>retain</em>. Der Grund dafür ist, dass wir beim Erstellen des Projekts <em>Use Automatic Reference Counting</em> angekreuzt haben. Dieses neue Feature erspart dem Programmierer das Memory Management.  <em>Retain</em> würde also Speicher für das Array reservieren. Durch ARC wird allerdings automatisch Speicher reserviert und dieser auch automatisch wieder freigegeben.</p>
<p>Öffne nun <em>PlayerlistViewController.m</em> und füge unter der @implementation-Zeile folgendes ein:</p>
<pre class="brush: objc; title: ; notranslate">
@synthesize playerList;
</pre>
<p>Die oben erstellte property wird hier einfach synthetisiert.</p>
<p>Die Tabellendaten sollen im Tutorial einfach in viewDidLoad erstellt werden. Schreibe also folgenden Code unter <em>[super viewDidLoad]</em> in der Methode <em>viewDidLoad:</em></p>
<pre class="brush: objc; title: ; notranslate">
    self.playerList = [NSMutableArray arrayWithCapacity:20];

    NSString *player;
    player = @&quot;Andreas&quot;;
    [self.playerList addObject:player];

    player = @&quot;Stefan&quot;;
    [self.playerList addObject:player];

    player = @&quot;Alex&quot;;
    [self.playerList addObject:player];
</pre>
<p>Die Funktionen <em>tableView:numberOfSectionsInTableView</em> und <em>tableView:numberOfRowsInSection </em>sind noch genauso, wie wir sie von früher kennen:</p>
<pre class="brush: objc; title: ; notranslate">
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    // Return the number of rows in the section.
    return [self.playerList count];
}
</pre>
<p>Die uns schon bekannte Funktion <em>tableView:cellForRowAtIndexPath </em>hat sich allerdings leicht geändert:</p>
<pre class="brush: objc; title: ; notranslate">
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@&quot;PlayerCell&quot;];
    NSString *player = [self.playerList objectAtIndex:indexPath.row];
    cell.textLabel.text = player;

    // Configure the cell...

    return cell;
}
</pre>
<p>Zuerst wird die Zelle mit dem Indentifier &#8220;PlayerCell&#8221; aus dem Storyboard geladen und dann dem Label in dieser Zeile der passende Text zugewiesen.</p>
<p>Damit ist alles notwendige für die Table View getan. Wenn du die App nun ausführst, werden die drei Spieler angezeigt.</p>
<p><strong>5. Schluss</strong></p>
<p>Ich denke ich werde noch einen Part 3 schreiben, wahrscheinlich über den Detail View der Table View und den Tab Bar Controller.</p>
<p>Den Code für diesen Part gibt&#8217;s hier: <a href="http://www.iosdevgermany.de/wp-content/uploads/2011/12/Tutorial6_2.zip">Tutorial6_2</a></p>
<p>Zum Schluss möchte ich euch noch schöne Weihnachtsfeiertage wünschen und einen guten Rutsch in neue Jahr 2012.</p>
<p>Wie immer würde ich mich freuen, wenn du mir auf <a title="iOsDevGermany auf Twitter" href="http://www.twitter.com/iosdevgermany" target="_blank">Twitter</a> folgst oder den Blog <a title="Feed von iOsDevGermany" href="http://www.iosdevgermany.de/feed">abonnierst</a>. Wenn du willst kannst du den Artikel gerne mit anderen teilen <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<div class="shr-publisher-861"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/GaZhEv-SIKI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view</feedburner:origLink></item>
		<item>
		<title>iPhone SDK Tutorial deutsch 6 – Storyboard Part 1 – Grundlagen</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/cux-6fYjv6g/</link>
		<comments>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 10:49:48 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Storyboard]]></category>
		<category><![CDATA[Xcode 4.2]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=795</guid>
		<description><![CDATA[Im iOs 5 SDK gibt es ein fantastisches neues Feature: Das Storyboard. In diesem mehrteiligen Tutorial zeige ich was das ist und wie man es benutzt. Hinweis: Du benötigst für dieses Tutorial mindestens Xcode Version 4.2 Mit Hilfe der Storyboards &#8230; <a href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Im iOs 5 SDK gibt es ein fantastisches neues Feature: Das Storyboard. In diesem mehrteiligen Tutorial zeige ich was das ist und wie man es benutzt.</p>
<p>Hinweis: Du benötigst für dieses Tutorial mindestens Xcode Version 4.2</p>
<p>Mit Hilfe der Storyboards lässt sich das Interface deiner App viel leichter gestalten. Zuvor hat man .xib-Dateien für das Interface benutzt, welche das Aussehen jeder Szene einzeln enthielten. Mit Storyboards muss man weniger Code schreiben, und kann mit einer einzigen Datei, das komplette Interface gestalten. In diesem Part zeige ich die Grundlagen dieser Neuerung.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-DasStoryboard.png"><img class="aligncenter size-medium wp-image-835" title="Tutorial6-DasStoryboard" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-DasStoryboard-300x131.png" alt="" width="300" height="131" /></a></p>
<p><span id="more-795"></span></p>
<p><strong>1. Das Projekt erstellen</strong></p>
<p>Öffne Xcode und erstelle ein neues Projekt. Wähle dazu das &#8220;Single View Application&#8221;-Template (Mehr zu den neuen Templates erfährst du <a title="Xcode 4.2: Projekt Templates" href="http://www.iosdevgermany.de/tipp/xcode-4-2-projekt-templates/">hier</a>). Klicke auf <em>Next</em> und gibt wie gewohnt bei <em>Product Name</em> den Namen des Projekts an, z.B. &#8220;Tutorial6&#8243;. Wichtig ist, dass du bei <em>Device Family </em>die Option <em>iPhone</em> auswählst und den Haken bei <em>Use Storyboard </em>und <em>Use Automatic Reference Counting </em><strong>setzt</strong>.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NeuesProjektOptionen.png"><img class="aligncenter size-full wp-image-796" title="Tutorial 6 - Neues Projekt erstellen Optionen Xcode 4.2" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NeuesProjektOptionen.png" alt="" width="731" height="494" /></a>Klicke wieder auf <em>Next</em> und gib den Speicherort des Projekts an.</p>
<p><strong>2. Das Projekt</strong></p>
<p>Schauen wir uns zuerst einmal um: Im <em>Project Navigator </em>in der linken Seitenleiste befinden sich die Dateien des Projekts. Bekannt sind uns bereits die Dateien <em>AppDelegate.h, AppDelegate.m, sowie der ViewController</em>. Allerdings fehlt da eine Datei: MainWindow.xib. Das liegt daran, dass wenn wir das Storyboard verwenden, wir keine .xib-Dateien benötigen. Somit wird auch MainWindow.xib überflüssig. Dafür ist eine andere Datei dazugekommen: <em>MainStoryboard.storyboard</em>. Bevor wir uns diese Datei genauer ansehen, werfen wir nochmal einen Blick auf die Projekt-Datei. In dieser wird nämlich angegeben, wo sich das Interface der App befindet. In unserem Fall in <em>MainStoryboard</em>. Wolltest du eine andere Interface-Datei verwenden, so könntest du hier angeben welche.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-ProjektDatei.png"><img class="aligncenter size-large wp-image-797" title="Tutorial 6 - Projekt-Datei" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-ProjektDatei-1024x855.png" alt="" width="640" height="534" /></a></p>
<p><strong>3. Das Storyboard</strong></p>
<p>Öffne jetzt die Datei <em>MainStoryboard.storyboard</em>. Daraufhin erscheint der Storyboard Editor. Dieser erinnert stark an den Interface Builder und tatsächlich funktioniert er ganz ähnlich.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-StoryboardEditor.png"><img class="aligncenter size-large wp-image-798" title="Tutorial 6 - Storyboard Editor" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-StoryboardEditor-1024x720.png" alt="" width="640" height="450" /></a>Rechts unten befindet sich die Library von der wir, wie gewohnt, Objekte in dem View ziehen können. Darüber befindet sich die Leiste mit den verschiedenen <em>inspectors</em>, in welchen man die Eigenschaften eine Objekts ändern kann. Im Editor-Bereich befindet sich bereits ein View Controller. Unter dem View ist eine schwarze Leiste, das Dock. Möchte man den View Controller auswählen, klickt man ganz einfach auf dieses Dock. Daraufhin erscheinen zwei Objekte: das View Controller-Objekt und das First Responder-Objekt. In diesem Part sind beide für uns noch nicht von großer Bedeutung.</p>
<p><strong>4. Der erste View Controller</strong></p>
<p>Fangen wir an das Interface der App zu erstellen. Suche in der Library den <em>Round Rect Button</em> und ziehe ihn in die Mitte des Views. Beschrifte den Button wie hier:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-ErsterViewController1.png"><img class="aligncenter size-full wp-image-807" title="Tutorial 6 - Erster View Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-ErsterViewController1.png" alt="" width="516" height="623" /></a></p>
<p>Wir können die App schonmal probehalber ausführen, um zu sehen ob alles funktioniert&#8230; Der Button wird wie gewollt angezeigt.</p>
<p>Bevor wir nun dem Button eine Action zuweisen, erstellen wir noch einen Navigation Controller. Das ist denkbar einfach: Klicke auf das Dock des View Controllers, um ihn auszuwählen und gehe in der Menüleiste von Xcode auf<br />
<strong>Editor -&gt; Embed In -&gt; Navigation Controller</strong>.<br />
Daraufhin erscheint neben unserem ersten View Controller ein Navigation Controller. Die beiden Controller sind mit einer sog. <em>Relationship</em> miteinander verbunden.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NavigationController3.png"><img class="aligncenter size-large wp-image-812" title="Tutorial 6 - Navigation Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NavigationController3-1024x896.png" alt="" width="640" height="560" /></a>Außerdem wird im <em>Document Outline</em> (linke Seitenleiste im Editor) eine neue Sektion für den Navigation Controller erstellt. Diese enthält außerdem das Relationship-Objekt.<br />
Der Vollständigkeit halber ändern wir noch die Überschrift des Views. Wähle dazu die Navigation Bar des <em>View</em> Controllers (rechter Controller) aus und gib im <em>Attributes inspector</em> unter <em>Title </em>&#8220;Hauptmenü&#8221; ein.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NavigationBar1.png"><img class="aligncenter size-full wp-image-816" title="Tutorial 6 - Navigation Bar" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NavigationBar1.png" alt="" width="642" height="485" /></a>Wenn wir die App nun erneut ausführen wird am oberen Rand des Views die Navigation Bar angezeigt.</p>
<p><strong>5. Einen neuen View Controller erstellen</strong></p>
<p>Wenn der Button angeklickt wird, soll ein neuer View angezeigt werden. Dazu fügen wir einen neuen View Controller hinzu. Um das mit Hilfe von .xib-Dateien zu realisieren, müssten wir viel Code schreiben und viele Verknüpfungen im Interface Builder erstellen. Mit dem Storyboard geht das ohne eine Zeile Code mit wenigen Mausklicks.</p>
<p>Zuvor verschaffen wir uns allerdings noch etwas mehr Überblick. Doppelklicke dazu auf eine leere Stelle im Editor oder klicke auf das kleine Lupen Symbol mit dem Minus in der rechte unteren Ecke des Editors. Damit wird heraus gezoomt und wir haben Platz einen weiteren View Controller hinzu zu fügen.<br />
Ziehe aus der Library einen <em>View Controller</em> und platziere ihn neben dem anderen.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NeuerViewController.png"><img class="aligncenter size-large wp-image-822" title="Tutorial 6 - Neuer View Controller" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NeuerViewController-1024x696.png" alt="" width="640" height="435" /></a>Als nächstes klicken wir mit gedrückter ctrl-Taste auf den Button im Hauptmenü-View Controller, halten die Taste gedrückt und ziehen den blauen Faden auf den neuen View Controller. Im daraufhin erscheinenden Dialog wählen wir <em>Push.</em> Dadurch, dass wir dies auswählen, erscheint im zweiten View automatisch eine Navigation Bar und es wird sogar ein <em>Zurück</em>-Button angelegt (sichtbar in der App), mit dem wir wieder zum ersten View zurückkehren können. Und wir müssen dafür gar nichts mehr machen.<br />
<a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NavigationControllerBleibtErhalten.png"><img class="aligncenter size-full wp-image-823" title="Tutorial 6 - Navigation Controller bleibt erhalten" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-NavigationControllerBleibtErhalten.png" alt="" width="803" height="592" /></a></p>
<p>Führe die App aus, um es auszuprobieren.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-DieFertigeApp.png"><img class="aligncenter size-full wp-image-832" title="Tutorial 6 - Die fertige App" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-DieFertigeApp.png" alt="" width="396" height="744" /></a></p>
<p><strong>6. Den View anpassen</strong></p>
<p>Hinweis: Um neue Objekte in den View Controller hinein zu ziehen, müssten wir nun wieder heran zoomen.</p>
<p>Zum Schluss zeige ich noch, wie man einen View anpasst (z.B. die Hintergrundfarbe ändert), da das im Storyboard Editor (minimal) anders ist, als im IB. Damit wir den View anpassen können, müssen wir ihn erstmal finden <img src='http://www.iosdevgermany.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . Er befindet sich innerhalb des View Controllers. Um ihn anzuzeigen, klicken wir im <em>Document Outline</em> unter der Sektion des &#8220;Spieler-Liste&#8221;-View Controllers auf den grauen Pfeil neben <em>View Controller &#8211; Spieler-Liste.</em></p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-ViewDesViewControllers.png"><img class="aligncenter size-full wp-image-826" title="Tutorial 6 - View des View Controllers" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tutorial6-ViewDesViewControllers.png" alt="" width="223" height="257" /></a>Daraufhin erscheint das View-Objekt, welches du nun im <em>Attributes inspector</em> nach Belieben anpassen kannst.</p>
<p><strong>7. Schluss</strong></p>
<p>Ich glaube der enorme Vorteil des Storyboards ist ersichtlich: Wir haben ohne eine Zeile Code zu schreiben einen Navigation Controller und einen zusätzlichen View Controller implementiert.<br />
Im nächsten Part werden wir noch eine Table View hinzufügen: <a title="iPhone SDK Tutorial deutsch 6 – Storyboard Part 2 – Table View" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-2-table-view/">iPhone SDK Tutorial deutsch 6 &#8211; Storyboard Part 2 &#8211; Table View</a>.</p>
<p>Den Code für dieses Tutorial kannst du hier downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/iPhone_SDK_Tutorial_deutsch_6-Storyboard_Part_1-Grundlagen.zip">iPhone_SDK_Tutorial_deutsch_6-Storyboard_Part_1-Grundlagen</a></p>
<p>Wenn du möchtest kannst du den Blog abonnieren oder mir auf <a href="https://twitter.com/iOsDevGermany">Twitter</a> folgen.</p>
<div class="shr-publisher-795"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/cux-6fYjv6g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=iphone-sdk-tutorial-deutsch-6-storyboard-part-1-grundlagen</feedburner:origLink></item>
		<item>
		<title>Xcode 4.2: Projekt Templates</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/vVyC-APVZDw/</link>
		<comments>http://www.iosdevgermany.de/tipp/xcode-4-2-projekt-templates/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 19:05:33 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[Tipp]]></category>
		<category><![CDATA[iOS 5]]></category>
		<category><![CDATA[Xcode 4.2]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=782</guid>
		<description><![CDATA[Diesmal kein Tutorial, sondern nur ein kleiner Tipp. Mit der neuen Version von Xcode (4.2) haben sich die Projekt-Templates geändert. So existiert ab sofort kein &#8220;View-based Application&#8221;-Template mehr. In diesem Artikel zeige ich, wie du trotzdem ein Projekt mit dem &#8230; <a href="http://www.iosdevgermany.de/tipp/xcode-4-2-projekt-templates/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Diesmal kein Tutorial, sondern nur ein kleiner Tipp.</p>
<p>Mit der neuen Version von Xcode (4.2) haben sich die Projekt-Templates geändert. So existiert ab sofort kein &#8220;View-based Application&#8221;-Template mehr. In diesem Artikel zeige ich, wie du trotzdem ein Projekt mit dem altgewohnten Aufbau erstellen kannst.</p>
<p><span id="more-782"></span></p>
<p><strong>1. Die neuen Templates</strong></p>
<ul>
<ul>
<li><em><strong>&#8220;View-based Application&#8221;-Template</strong></em> heist jetzt <span style="color: #000000;"><strong>&#8220;Single View Application&#8221;</strong></span></li>
<li><em><strong><span style="color: #000000;">&#8220;Navigation-based Application&#8221;-Template </span></strong></em><span style="color: #000000;">heist jetzt <strong>&#8220;Master-Detail Application&#8221;-Template</strong></span></li>
<li><em><span style="color: #000000;"><strong>&#8220;Tab Bar Application&#8221;-Template </strong></span></em><span style="color: #000000;">heist jetzt<strong> &#8220;Tabbed Application&#8221;-Template</strong></span></li>
</ul>
</ul>
<div><span class="Apple-style-span" style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 12px; line-height: 18px;"><img class="aligncenter size-full wp-image-791" style="color: #444444; font-family: Georgia, 'Bitstream Charter', serif; line-height: 1.5; border-style: initial; border-color: initial; margin-top: 0px; margin-right: auto; margin-bottom: 12px; margin-left: auto; display: block; clear: both; max-width: 100%; height: auto; border-width: 0px;" title="Tipp 1 - Projekt Optionen" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tip1-ProjectOption.png" alt="" width="728" height="493" /></span></div>
<p><strong>2. Use Storyboard?</strong></p>
<p>Beim Erstellen eines Projekt fällt auf, dass es bei fast jedem Template die Option <em>Use Storyboard</em> gibt. Dieses Storyboard ersetzt im iOS SDK 5 mehr oder minder die .xib-Dateien. Sie machen es möglich sehr schnell neue View Controller zu erstellen und zu gestalten, ohne viel Code schreiben zu müssen. Ich werde so bald wie möglich ein Tutorial über das Storyboard schreiben.<br />
In den älteren Tutorials werden allerdings noch .xib-Dateien verwendet. Entferne also, wenn nicht anders angegeben, den Haken bei <em>Use Storyboard.</em></p>
<p><strong>3. Use Automatic Reference Counting</strong></p>
<p><em>Automatic Reference Counting</em> hilft dem Entwickler beim Memory Management. Wie das Storyboard, wird es in den älteren Tutorials nicht verwendet und sollte deshalb, wenn nicht anders angegeben, nicht angekreuzt sein.</p>
<p><span class="Apple-style-span" style="color: #000000;"><strong>4. Device Family</strong></span></p>
<p>Mit der Option <em>Device Family </em>kannst du festlegen, für welche iDevice du die App erstellen willst. In den meisten Fällen wird in den Tutorials nur iPhone angegeben.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tipp1-Options.png"><img class="aligncenter size-full wp-image-793" title="Tipp 1 - Optionen" src="http://www.iosdevgermany.de/wp-content/uploads/2011/11/Tipp1-Options.png" alt="" width="730" height="494" /></a></p>
<p>Ich hoffe ich konnte mit diesem kleinem Tipp weiterhelfen. Wenn du den Blog weiter verfolgen möchtest, kannst du ihn abonnieren oder auf <a title="iOsDevGermany - Twitter" href="http://twitter.com/#!/iosdevgermany">Twitter</a> folgen.</p>
<div class="shr-publisher-782"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/vVyC-APVZDw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tipp/xcode-4-2-projekt-templates/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tipp/xcode-4-2-projekt-templates/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=xcode-4-2-projekt-templates</feedburner:origLink></item>
		<item>
		<title>iPhone SDK Tutorial deutsch 5 – Tab Bar Controller</title>
		<link>http://feedproxy.google.com/~r/iosdevgermany/~3/rTJ-Ih4ZQog/</link>
		<comments>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-5-tab-bar-controller/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 09:01:11 +0000</pubDate>
		<dc:creator>Felix</dc:creator>
				<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Interface Builder]]></category>
		<category><![CDATA[Tab Bar Controller]]></category>

		<guid isPermaLink="false">http://www.iosdevgermany.de/?p=711</guid>
		<description><![CDATA[Hinweis: Dieses Tutorial ist für Xcode Version 4.1 geschrieben und mit der neuesten Version nicht nachvollziehbar. Alle aktuellen Tutorials findest du in der Übersicht. Auf den Wunsch eines Lesers hin, schreibe ich ein Tutorial über den Tab Bar Controller und das &#8230; <a href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-5-tab-bar-controller/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><em>Hinweis: Dieses Tutorial ist für Xcode Version 4.1 geschrieben und mit der neuesten Version nicht nachvollziehbar. Alle aktuellen Tutorials findest du in der <a title="Tutorials" href="http://www.iosdevgermany.de/tutorials/">Übersicht</a>.</em></p>
<p>Auf den Wunsch eines Lesers hin, schreibe ich ein Tutorial über den Tab Bar Controller und das Sortieren von Tabellen Daten.</p>
<p>Hinweis: Bevor du dieses Tutorial durcharbeitest, solltest du dich mit Tabellen Views auskennen. Ein Tutorial dazu findest du hier: <a title="iPhone SDK Tutorial deutsch 4 – UITableView Part 1 – Grundlagen" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-4-uitableview-part-1-grundlagen/">UITableView Tutorial</a></p>
<p><strong>1. In diesem Tutorial</strong></p>
<p>Die App stellt einen digitalen Kassenzettel dar:</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_DieApp1.png"><img class="aligncenter size-full wp-image-720" title="Tutorial 5 Die App" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_DieApp1.png" alt="" width="396" height="744" /></a></p>
<p>Die Gegenstände auf dem Kassenzettel sind, je nachdem welcher Tab angewählt ist, nach Preis oder Namen sortiert.</p>
<p><span id="more-711"></span><strong>2. Das Projekt erstellen</strong></p>
<p>In diesem Tutorial lernen wir wieder ein neues Projekt-Template kennen: Das <em>Tab Bar Application Template</em>. Öffne Xcode und wähle im Menü File-&gt;New-&gt;New Project&#8230;-&gt;Tab Bar Application. Ich nenne das Projekt <em>Tutorial5</em>.</p>
<p><strong>3. Der Tab Bar Controller</strong></p>
<p>Zuerst wollen wir uns den Tab Bar Controller etwas genauer anschauen. Bevor wir das tun, führen wir die App einfach mal aus, ohne das Template verändert zu haben. Die App besteht aus einem ganz normalen View und einer schwarzen Leiste am unteren Rand des Bildschirms. Mit dieser Leiste, der sogenannten Tab Bar, können wir zwischen zwei verschiedenen Reitern wählen. Je nachdem wird der First View bzw. der Second View angezeigt.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_TabBarApplication.png"><img class="aligncenter size-full wp-image-725" title="Tutorial 5 Tab Bar Application" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_TabBarApplication.png" alt="" width="396" height="744" /></a>Der Text in beiden Views verweist auf die Datei <em>MainWindow.xib</em>. Kehre also zu Xcode zurück und öffne die besagte Datei. In der linken Seitenleiste im <em>Interface Builder</em> unter <em>Objects </em>finden wir drei Elemente. Das <em>Tutorial5 App Delegate, Window</em> und <em>Tab Bar Controller</em>. Wir wollen uns den Tab Bar Controller etwas genauer ansehen. Klicke dazu auf den Pfeil neben dem Icon des Objects. Es kommen nun weitere Elemente zum Vorschein. Wir klicken zuerst mal auf die <em>Tab Bar</em>. Daraufhin erscheint im View eine schwarze Leiste am unteren Rand des Views. Dieses Object ist demnach, wie der Name schon sagt, die eigentliche Tab Bar. Allerdings befinden sich innerhalb des Tab Bar Controllers noch zwei weitere Objects, zwei View Controller. Dies sind jene Views, die wir im iPhone Simulator bereits gesehen haben: <em>First View Controller </em>und <em>Second View Controller</em>. Für jeden Reiter der Tab Bar existiert also ein eigener View Controller.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_MainWindow.png"><img class="aligncenter size-full wp-image-722" title="Tutorial 5 MainWindow" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_MainWindow.png" alt="" width="211" height="269" /></a>Für unsere App benötigen wir Tabellen Views. First und Second View Controller sind allerdings ganz normale Views. Wir könnten die beiden Controller zwar zu Table Views umschreiben, allerdings geht es schneller, wenn wir von Anfang an mit Table Views arbeiten.</p>
<p><strong>4. Die View Controller</strong></p>
<p>Wir beginnen also, indem wir die Dateien aus denen die zwei View Controller bestehen löschen. Klicke dazu mit der rechten Maustaste auf die ausgewählten Objekte und wähle <em>Delete</em>. Im daraufhin erscheinenden Fenster wählst du wieder <em>Delete.</em></p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_ViewControllerLöschen.png"><img class="aligncenter size-full wp-image-726" title="Tutorial 5 View Controller löschen" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_ViewControllerLöschen.png" alt="" width="261" height="368" /></a>Hinweis: Die Objects der beiden View Controller in MainWindow.xib müssen <strong>nicht</strong> gelöscht werden, da wir sie später einfach weiterverwenden werden.</p>
<p>Nun erstellen wir unseren eigenen View Controller. Wir fangen mit dem an, der die Einkaufsgegenstände nach Preis sortiert anzeigt. Klicke also mit der rechten Maustaste auf den Projektordner (hier: <em>Tutorial5</em>) und wähle <em>New File&#8230;</em> Unter <em>Cocoa Touch</em> müssen wir uns für <em>UIViewController subclass</em> entscheiden. Klicke auf <em>Next</em> und wähle im nächsten Dialog einen <em>UITableViewController.</em> Außerdem sollte nur der Haken bei <em>With XIB for User Interface</em> ausgewählt sein. Der View Controller soll <em>ByPriceViewController</em> heißen.</p>
<p>Wie bei fast jeder Tabellen View erstellen wir zuerst eine Variable, in der die Zeilen der Tabelle gespeichert werden. In diesem Fall ist das ein Array mit den Einkaufsgegenständen.</p>
<p>Wir öffnen also die Datei <em>ByPriceViewController.h, </em>fügen die Membervariable hinzu und erstellen zugleich deren Eigenschaft. Die Datei sieht danach so aus:</p>
<pre class="brush: objc; title: ; notranslate">
#import &lt;UIKit/UIKit.h&gt;

@interface ByPriceViewController : UITableViewController {
    NSArray *salesSlip;
}
@property (nonatomic, retain) NSArray *salesSlip;

@end
</pre>
<p>Öffne jetzt <em>ByPriceViewController.m</em> und schreibe unter <em>@implementation ByPriceViewController</em>:</p>
<pre class="brush: objc; title: ; notranslate">
@synthesize salesSlip;
</pre>
<p>Zunächst fügen wir folgende Methode am Ende der Datei, vor <em>@end</em> ein. Die Methode dealloc:</p>
<pre class="brush: objc; title: ; notranslate">
-(void) dealloc {
    self.salesSlip = nil;
    [super dealloc];
}
</pre>
<p>Wie bei jeder Tabellen View müssen noch die Methoden <em>numberOfSectionsInTableView:</em> und <em>tableView:numberOfRowsInSection:</em> abgeändert werden. Dir ist vielleicht schon aufgefallen, dass Xcode uns zwei Warnung ausspuckt.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_warnings.png"><img class="aligncenter size-full wp-image-738" title="Tutorial 5 warnings" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_warnings.png" alt="" width="659" height="194" /></a>Diese sollen uns nur darauf hinweisen, dass die Tabelle bisher keine Sections und keine Zeilen enthält und die Implementierung daher unvollständig ist.</p>
<p>Das ändern wir nun:</p>
<pre class="brush: objc; title: ; notranslate">
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    // Return the number of rows in the section.
    return [salesSlip count];
}
</pre>
<p>Unsere Tabelle soll nur eine Section haben und so viele Zeilen wie das Array <em>salesSlip</em> Elemente hat.</p>
<p>Jetzt füllen wir das Array mit Daten, sodass die Tabelle bereits beim Start der App ein paar Zeilen besitzt. Außerdem werden diese sogleich sortiert. In einer richtigen App würde man die Daten aus einer Datenbank oder einer Datei auslesen, allerdings werden wir unsere Tabelle einfach in der Methode <em>viewDidLoad</em> füllen. Das macht in einer richtigen App zwar offen gesagt wenig Sinn, hier reicht es aber aus.</p>
<p>So sieht die Funktion <em>viewDidLoad</em> aus:</p>
<pre class="brush: objc; title: ; notranslate">
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableArray *data = [NSMutableArray array];

    [data addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:629.00], @&quot;price&quot;, @&quot;iPhone 4s&quot;, @&quot;name&quot;, nil]];

    [data addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:129.00], @&quot;price&quot;, @&quot;iPod nano&quot;, @&quot;name&quot;, nil]];

    [data addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:189.00], @&quot;price&quot;, @&quot;iPod Touch (weiß)&quot;, @&quot;name&quot;, nil]];

    [data addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:20.00], @&quot;price&quot;, @&quot;20€ iTunes-Gutschein&quot;, @&quot;name&quot;, nil]];

    NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]initWithKey:@&quot;price&quot; ascending:NO]autorelease];
    self.salesSlip = [data sortedArrayUsingDescriptors: [NSArray arrayWithObject:sorter]];

}
</pre>
<p>In Zeile 5 erstellen wir das Array <em>data</em> zu welchem wir in Zeile 7-13 Einkaufsgegenstände hinzufügen. Die Gegenstände sind NSDictionaries mit den Objekten &#8220;price&#8221; und &#8220;name&#8221;.<br />
In Zeile 15 wird ein NSSortDescriptor deklariert und definiert. Wir geben an das er nach &#8220;price&#8221; sortieren soll. <em>Ascending</em> bedeutet ob aufsteigend (YES) oder absteigend (NO) sortiert wird. In Zeile 16 wird <em>data</em> mit dem SortDescpritor sorter aus Zeile 15 sortiert und gleich dem Array <em>salesSlip</em> zugewiesen. Dadurch enthält <em>salesSlip</em> nun alle Einkaufsgegenstände, sortiert nach Preis.</p>
<p>Zum Schluss geben wir das Aussehen der Zeilen in der Funktion <em>tableView:cellForRowAtIndexPath:</em> an. Wir benutzen <em>UITableViewCellStyleValue1.</em></p>
<p><em>tableView:cellForRowAtIndexPath:</em></p>
<pre class="brush: objc; title: ; notranslate">
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @&quot;Cell&quot;;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    NSDictionary *item = [salesSlip objectAtIndex:indexPath.row];

    cell.textLabel.text = [item objectForKey:@&quot;name&quot;];

    NSNumber *price = [item objectForKey:@&quot;price&quot;];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    cell.detailTextLabel.text = [formatter stringFromNumber:price];
    [formatter release];

    return cell;
}</pre>
<p><span style="text-decoration: underline;">Zeile 11:</span> Wir holen das passende NSDictionary-Objekt aus <em>salesSlip</em> und speichern es in <em>item.</em> (Das Prinzip von <em>tableView:cellForRowAtIndexPath:</em> wird in <a title="iPhone SDK Tutorial deutsch 4 – UITableView Part 1 – Grundlagen" href="http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-4-uitableview-part-1-grundlagen/">Tutorial 4.1</a> erläutert)<br />
<span style="text-decoration: underline;">Zeile 13:</span> Das <em>textLabel</em> der Zeile soll den Namen des Gegenstandes tragen. Wir bekommen ihn, indem wir im Dictionary i<em>tem</em> nach dem <em>key</em> &#8221;name&#8221; suchen.<br />
<span style="text-decoration: underline;">Zeile 15-19:</span> Das <em>detailTextLabel</em> wird den Preis des Gegenstandes anzeigen. Wir holen den Wert aus dem Dictionary <em>item</em> und wandeln die Zahl dann in einen string um, damit wir ihn dem <em>deatilTextLabel</em> übergeben können.</p>
<p>Damit wären wir mit dem ersten der beiden View Controller fertig. Es folgt jetzt der zweite.</p>
<p>Erstelle also einen neuen Table View Controller und nenne ihn <em>ByNameViewController</em>.</p>
<p>Öffne die Datei <em>ByNameViewController.h</em> und füge wieder die Membervariable <em>salesSlip</em> hinzu:</p>
<pre class="brush: objc; title: ; notranslate">
#import &lt;UIKit/UIKit.h&gt;

@interface ByNameViewController : UITableViewController {
    NSArray *salesSlip;
}
@property (nonatomic, retain) NSArray *salesSlip;

@end
</pre>
<p>Da die Datei <em>ByNameViewController.m</em> fast genauso aussieht wie <em>ByPriceViewController.m </em>können wir ausnahmsweise kopieren und einfügen. Öffne dazu <em>ByPriceViewController.m</em> und kopiere alles von <em>@synthesize salesSlip;</em> bis <em>@end</em>. Öffne <em>ByNameViewController.m</em> und makiere alles von -<em>(id)initWithStyle:(UITableViewStyle)style</em> bis <em>@end</em> und füge den Code ein.</p>
<p>Das einzige was wir noch ändern müssen ist der NSSortDescriptor in <em>viewDidLoad:</em></p>
<pre class="brush: objc; title: ; notranslate">
    NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]initWithKey:@&quot;name&quot; ascending:YES]autorelease];
</pre>
<p>Diesmal wird aufsteigend nach Namen sortiert.</p>
<p><strong>5. Die View Controller im Interface Builder</strong></p>
<p>Öffne die Datei <em>MainWindow.xib</em> wähle in der Objects-Leiste den <em>First View Controller</em>. Lasse ihn dir im I<em>dentity inspector </em>anzeigen. Bei <em>Class</em> schreibst du <em>ByPriceViewController</em>.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_Class.png"><img class="aligncenter size-full wp-image-752" title="Tutorial 5 - Class" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_Class.png" alt="" width="261" height="320" /></a></p>
<p>Öffne jetzt den <em>Attributes inspector</em> und lösche den Text bei <em>NIB Name</em>.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_NIBName.png"><img class="aligncenter size-full wp-image-756" title="Tutorial 5 - NIB Name" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_NIBName.png" alt="" width="260" height="250" /></a></p>
<p>Zunächst ziehst du eine <em>Table View </em>aus der Library auf das Object <em>By Price View Controller</em>.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_TableView.png"><img class="aligncenter size-large wp-image-753" title="Tutorial 5 - Table View" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_TableView-1024x787.png" alt="" width="640" height="491" /></a>Drücke als Nächstes mit gedrückter ctrl-Taste auf die <em>Table View </em>und ziehe den blauen Faden auf den <em>By Price View Controller</em>.</p>
<p><a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_TableViewViewController.png"><img class="aligncenter size-full wp-image-754" title="Tutorial 5 - TableView mit ViewController verbinden" src="http://www.iosdevgermany.de/wp-content/uploads/2011/10/Tutorial5_TableViewViewController.png" alt="" width="202" height="369" /></a>Im erscheinenden Menü wählst du <em>dataSource</em>. Wiederhole es und wähle <em>delegate</em>.</p>
<p>Jetzt können wir die App das erste mal ausführen. Klicke auf Run um die App zu starten. Bisher funktioniert allerdings nur der erste Reiter.</p>
<p>Wiederhole nun alles ab Überschrift <em>5. Die View Controller im Interface Builder </em>für den <strong>Second View Controller<em>. </em></strong>Wenn du das getan hast, ist die App fertig.</p>
<p><strong>6. Schluss</strong></p>
<p>Den Code zum Tutorial kannst du hier downloaden: <a href="http://www.iosdevgermany.de/wp-content/uploads/2011/10/iPhone_SDK_Tutorial_deutsch_5_Tab_Bar_Controller.zip">iPhone_SDK_Tutorial_deutsch_5_Tab_Bar_Controller</a></p>
<p>Wenn ihr auch noch Tutorial-Vorschläge habt, gebt mir einfach bescheid. Wenn euch das Tutorial gefallen hat, könnt ihr meinen Blog abonnieren oder mir auf Twitter folgen.</p>
<div class="shr-publisher-711"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><img src="http://feeds.feedburner.com/~r/iosdevgermany/~4/rTJ-Ih4ZQog" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-5-tab-bar-controller/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.iosdevgermany.de/tutorial/iphone-sdk-tutorial-deutsch-5-tab-bar-controller/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=iphone-sdk-tutorial-deutsch-5-tab-bar-controller</feedburner:origLink></item>
	</channel>
</rss>

