iPhone 101: Implementace kontroleru pohledu
K implementaci kontroleru pohledu je potřeba několika kroků - instanční proměnné včetně správy paměti, implementace metody changeGreeting: a zrušení klávesnice po klepnutí na tlačítko Done.
Vlastnosti
Prvně je zapotřebí říct překladači aby syntetizoval přístupové metody.
Do souboru MyViewController.m přidejte následující řádek za @implementation MyViewController:
@synthesize textField; @synthesize label; @synthesize string;
Tímto řekneme překladači aby syntetizoval metody pro tyto vlastnosti podle specifikace kterou jste poskytli v souboru rozhraní. Například deklarace vlastnosti string je @property (nonatomic, copy) NSString *string;, takže překladač vygeneruje dvě přístupové metody: - (NSString *)string a - (void)setString:(NSString *)newString. V metodě setString: se vytvoří kopie řetězce předaného jak argument. To je užitečné pro zajištění zapouzdření (předaný řetězec může být modifikovatelný, takže vaší snahou je zajistit aby měl kontroler vlastní kopii). Více informací o zapouzdření najdete v Mechanisms of Abstraction v Object-Oriented Programming with Objective-C.
Musíte navrátit vlastnictví v metodě dealloc, protože všechny deklarace vlastností definují kontroler pohledu jako vlastníka instančních proměnných (copy implikuje vlastnictví, viz Memory Management Rules v Memory Management Programming Guide for Cocoa).
Změňte metodu dealloc v souboru MyViewController.m tak aby uvolnila instanční proměnné před voláním implementace v nadtřídě:
- (void)dealloc { [textField release]; [label release]; [string release]; [super dealloc]; }
Metoda changeGreeting:
Při klepnutí na tlačítko se kontroleru pohledu pošle zpráva changeGreeting:. Kontroler pohledu by pak měl dostat řetězec z texového pole a aktualizovat popisek.
Dokončete implementaci metody changeGreeting: v souboru MyViewController.m:
- (IBAction)changeGreeting:(id)sender { self.string = textField.text; NSString *nameString = string; if ([nameString length] == 0) { nameString = @"World"; } NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString]; label.text = greeting; [greeting release]; }
V této metodě se provádí několik operací:
self.string = textField.text; Tento řádek získává text z textového pole a přiřazuje jej proměnné instance string kontroleru.
V tomto případě ani nemusíte používat proměnnou instance někde jinde, ale je důležité abyste porozuměli konceptu. Je to velmi jednoduchý objekt modelu který je řízen kontrolerem pohledu. Obecně by kontroler měl obsahovat informaci o datech aplikace ve svých vlastních objektech modelu - data aplikace by neměla být uložena v prvcích uživatelského rozhraní.
- @"World" je řetězcová konstanta reprezentovaná instancí třídy NSString.
- Metoda initWithFormat: vytváří nový řetězec ve formátu specifikovaném formátovacím řetězcem, podobně jako ve funkci printf. %@ nahrazuje objekt řetzce. Více se o řetězcích můžete dozvědět v String Programming Guide for Cocoa.
Delegát textového pole
když nyní spustíte aplikaci a klepnete na tlačítko, mělo by se na popisku objevit "Hello, World!". Pokud však klepnete do textového pole a začnete psát, zjistíte že nemáte žádnou možnost jak ukončit vstup a zrušit klávesnici.
V iPhone aplikaci se klávesnice zobrazuje automaticky když je prvek, který umožňuje textový vstup, vybrán jako první odpovídající, a je automaticky zrušena když prvek tento status ztratí (o prvním odpovídajícím si můžete přečíst více v kapitole Event Handling z iPhone Application Programming Guide). Neexituje žádný způsob jak poslat zprávu přímo klávesnici; můžete ji ale zobrazit a zrušit jako vedlejší efekt přepínání statusu prvního odpovídajícího textového elementu.
V této aplikaci je prvním odpovídajícím textové pole. Po klepnutí na tlačítko Done by měla klávesnice zmizet.
Protokol UITextFieldDelegate obsahuje metodu textFieldShouldReturn:, kterou může textové pole zavolat kdykoliv uživatel klepne na tlačítko Return (ať už obsahuje jakýkoliv text). tuto metodu můžete implementovat a donutit tak textové pole aby se vzdalo statusu prvního odpovídajícího zasláním zprávy resignFirstResponder, jejíž vedlějším efektem je zrušení klávesnice.
V souboru MyViewController.m implementujte metodu textFieldShouldReturn::
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == textField) { [textField resignFirstResponder]; } return YES; }
V této aplikaci není opravdu nutné psát test theTextField == textField protože obsahuje jen jedno textové pole. Je ale vhodné na to poukázat, protože v případě že je váš objekt delegátem více než jednoho objektu téhož typu, potřebujete mezi nimi rozlišovat.
Sestavte a spusťte aplikaci; měla by se chovat dle očekávání (zkuste zadat vaše jméno, po klepnutí na Done by měla klávesnice zmizet a po dalším klepnutím na tlačítko Hello by se měl zobrazit pozdrav "Hello, <Vaše jméno>).
Pokud se aplikace nechová dle očekávání, musíte ji odladit.
Rekapitulace
Právě jste dokončili implementaci kontroleru pohledu a tím i vaši první iPhone aplikaci. Gratuluji.
Teď se chvíli zamyslete jak kontroler pohledu zapadá do celkové architektury aplikace. Ve většině iPhone aplikacích budete používat kontrolery pohledu.
Poté si odpočiňte a začněte přemýšlet co byste měli dělat dále.
iPhone 101, Využijte zoomování ve svých demech na Mac OS X | Dr3dweRkZ | iPhone 101, Odlaďování