Eerste stappen met UIKit

UIKit is het raamwerk dat je het vaakst zult gebruiken bij het ontwikkelen van iOS-applicaties. Het definieert de kerncomponenten van een iOS-applicatie, van labels en knoppen tot tabelweergaven en navigatiecontrollers. In dit artikel zullen we niet alleen beginnen met het verkennen van het UIKit-framework, we zullen ook de internals van een iOS-project en de basisbouwstenen van iOS-applicaties verkennen..


Wat is het UIKit-framework?

Hoewel het Foundation-framework klassen, protocollen en functies voor zowel iOS- als OS X-ontwikkeling definieert, is het UIKit-framework exclusief gericht op iOS-ontwikkeling. Het is het equivalent van de Application Kit of AppKit kader voor OS X-ontwikkeling.

Net als Foundation definieert UIKit klassen, protocollen, functies, gegevenstypen en constanten. Het voegt ook extra functionaliteit toe aan verschillende Foundation-klassen, zoals NSObject, NSString, en NSValue door het gebruik van Objective-C-categorieën.

Objectief-C-categorieën zijn een handige manier om extra methoden aan bestaande klassen toe te voegen zonder subklassen. Lees deze tutorial van Aaron Crabtree als je meer wilt weten over Objective-C-categorieën.

In plaats van de sleutelklassen van UIKit te verkennen zoals we deden voor het kader van de Foundation, zullen we een nieuw iOS-project maken en doorlopen om de klassen te verkennen die we tegenkomen. Door deze benadering te volgen, wordt snel duidelijk in welke context een klasse wordt gebruikt en hoe elke klasse past in het bredere schema van een iOS-applicatie en welke rol deze speelt.


Een nieuw begin

Start Xcode en maak een nieuw project door te selecteren Nieuw> Project ...  van de het dossier menu. Selecteer de. In het gedeelte iOS aan de linkerkant Toepassing categorie. Kies de. In de lijst met projectsjablonen Toepassing enkele weergave sjabloon.

De toepassingssjabloon voor één weergave bevat de basisbouwstenen van een iOS-toepassing en is daarom een ​​goede plaats om onze reis te beginnen.

Geef het project een naam UIKit en voer een organisatienaam en bedrijfsidentificatie in. Voer een klassenprefix in, zoals ik eerder in deze reeks heb uitgelegd en stel in apparaten naar iPhone.

Vertel Xcode waar u het nieuwe project wilt opslaan en zorg ervoor dat u het project onder versiebeheer plaatst door het vakje met het label aan te vinken Maak git repository op mijn Mac. Herzie dit artikel voor meer informatie over versiebeheer en de voordelen ervan.


Bestanden en mappen

We hebben heel wat nieuwe dingen geleerd sinds de laatste keer dat we vanuit het niets een iOS-project hebben gemaakt, dus het is een goed idee om de verschillende bestanden en mappen van ons nieuwe project te verkennen om te zien of ze een belletje rinkelen.

In de Project Navigator, je zou drie mappen moeten zien aan de basis van het project;

  • producten
  • frameworks
  • een map met de naam van uw project, UIKit in dit voorbeeld
  • een map waarvan de naam eindigt TestsUIKitTests in dit voorbeeld

Laten we de inhoud van elk van deze mappen eens bekijken.

producten

De producten map bevat momenteel twee items. Het eerste item draagt ​​de naam van ons project en heeft een extensie van .app. De naam van het tweede item eindigt op Tests en heeft een extensie van .xctest. Ik zal eenheidstests in deze serie niet behandelen, dus je kunt het tweede item voorlopig negeren.

De map Producten bevat de toepassing of toepassingen die door het project zijn gemaakt na compilatie van de broncode.

Heb je dat opgemerkt? UIKit.app is rood gemarkeerd? Wanneer Xcode een bestand niet kan vinden, wordt het bestand in rood gemarkeerd. Omdat het project nog niet is gecompileerd, heeft Xcode het product nog niet gemaakt.

frameworks

De frameworks map bevat de kaders waaraan uw project is gekoppeld. In het vorige artikel was ons project alleen gekoppeld aan het kader van de Foundation. Dit project is echter gebaseerd op een iOS-applicatiesjabloon en daarom gekoppeld aan vier frameworks, Foundation, UIKit, Core Graphics en XCTest.

Mogelijk herinnert u zich het Core Graphics-raamwerk van eerder in deze serie. Het framework bevat de interfaces voor de (Quartz) 2D drawing API. Het XCTest-raamwerk houdt verband met unit-testen, die ik in deze serie niet zal behandelen.

Er is een andere locatie in ons project die aangeeft aan welke kaders het project is gekoppeld. Selecteer uw project in de Project Navigator, kies het enige item in de targets sectie aan de linkerkant en open de Bouw fases tab bovenaan.

Door de Binaire koppeling met bibliotheken lade, krijgt u dezelfde lijst met kaders die we in de map Frameworks hebben gezien. Ons project koppelen aan een ander iOS-systeemraamwerk is net zo eenvoudig als klikken op de plusknop onderaan de lijst en een kader uit de lijst selecteren.

Project folder

Het meeste van uw tijd wordt doorgebracht in de projectmap, die momenteel zes bestanden en een map met de naam bevat Ondersteunende bestanden. Laten we beginnen met het bekijken van de inhoud van de map Ondersteunende bestanden.

  • -Info.plist: Dit bestand, gewoonlijk het "info-dot-plist" -bestand van een project genoemd, is een eigenschappenlijst met verschillende configuratie-instellingen. De meeste van deze instellingen kunnen ook worden gewijzigd door het project te selecteren in de Project Navigator, het kiezen van het doel in de targets lijst en open de Algemeenmogelijkheden, en info tabs.
  • InfoPlist.strings: Als Info.plist bevat waarden die moeten worden gelokaliseerd, dan kunt u dat doen door ze op te geven InfoPlist.strings. Lokalisatie van applicaties is iets dat we in deze serie niet zullen behandelen.
  • main.m: Dit bestand zou nu al bekend moeten zijn. Wanneer u iOS-applicaties maakt, zal u echter zelden de inhoud van wijzigen main.m. Het bevat de applicaties hoofd functie, waar alle magie begint. Ook al zullen we niet wijzigen main.m, het is essentieel voor uw iOS-applicatie.
  • -Prefix.pch: Dit zijn de projecten voorgecompileerde header bestand, dat we al eerder in deze serie tegenkwamen. Zoals de naam al aangeeft, worden de headerbestanden in het vooraf gecompileerde headerbestand vooraf samengesteld door Xcode, waardoor de tijd die nodig is om uw project te compileren, wordt verminderd. Het kader van de Foundation en UIKit veranderen niet vaak, dus het is niet nodig om ze te compileren telkens wanneer u uw project compileert. Naast het pre-compileren van de headerbestanden die in het voorgecompileerde headerbestand staan, wordt elk bronbestand in uw project voorafgegaan door de weergegeven header-bestanden.

Applicatiecomponenten

Nu we weten wat de verschillende bestanden en mappen in ons project zijn, is het tijd om de verschillende componenten van een iOS-applicatie te verkennen. Terwijl we onze reis vervolgen, komen we verschillende klassen tegen die bij UIKit horen. Elke klasse die tot het UIKit-framework behoort, begint met het klassenprefix UI. Onthoud dat Foundation-klassen worden voorafgegaan door NS.


Het Model-View-Controller-patroon

Voordat we het UIKit-framework gaan verkennen, wil ik het hebben over het Model-View-Controller (MVC) -patroon. Het MVC-patroon is een van de meest voorkomende patronen in objectgeoriënteerd programmeren. Het bevordert de code-herbruikbaarheid en heeft nauwe banden met het concept van scheiding van verantwoordelijkheden of zorgen. Een van de hoofddoelstellingen van het MVC-patroon is de scheiding van de bedrijfslogica van een toepassing en de presentatielaag.

Cocoa Touch omarmt het MVC-patroon en het is daarom belangrijk om te begrijpen wat het is en hoe het werkt. Met andere woorden, door het MVC-patroon te begrijpen, zal het veel gemakkelijker zijn om te begrijpen hoe de verschillende componenten van een iOS-applicatie samenwerken.

In het MVC-patroon beheert een model de bedrijfslogica van een toepassing. Interactie met een database is bijvoorbeeld de verantwoordelijkheid van het model. In de weergave worden de gegevens weergegeven die door het model aan de gebruiker worden beheerd. De weergave beheert de gebruikersinterface en gebruikersinvoer.

De controller is de lijm tussen het model en het beeld. Terwijl het model en het beeld elkaars bestaan ​​niet kennen, weet de controller zowel van het model als van het beeld.

Omdat de controller bekend is met zowel het model als het aanzicht, is het vaak het minst herbruikbare onderdeel van een toepassing. Hoe minder een object weet over zijn omgeving en de objecten waarmee het interageert, des te hoger de herbruikbaarheid in toekomstige projecten.


UiApplication

Hoewel het UiApplication klasse is een belangrijk onderdeel van elke iOS-applicatie, je zult er niet vaak mee communiceren en je zult zelden of nooit de behoefte voelen om een ​​subklasse te krijgen UiApplication.

Wanneer een toepassing wordt gestart, wordt er een singleton van deze klasse gemaakt. Weet je nog wat een enig object is? Het betekent dat slechts één objectinstantie van de UiApplication klasse wordt aangemaakt tijdens de levensduur van een applicatie.

De UiApplication instance is het toegangspunt voor gebruikersinteractie en verzendt gebeurtenissen naar de juiste doelobjecten. De exacte betekenis hiervan zal binnen enkele minuten duidelijk worden wanneer we kijken naar beeldcontrollers.

In de meeste iOS-applicaties, de UiApplication instance heeft een delegatieobject eraan gekoppeld. Telkens wanneer u een iOS-project maakt met behulp van een van de meegeleverde sjablonen, maakt Xcode een klasse voor het delegeren van toepassingen voor u. Bekijk de namen van de bronbestanden in de projectmap in de projectnavigator. De eerste twee bestanden hebben de naam TSPAppDelegate.

De instantie van deze klasse is de afgevaardigde van de UiApplication Singleton. Voordat u de TSPAppDelegate klasse, we moeten begrijpen wat het patroon van de gedelegeerde is.

Ole Begemann schreef een uitstekend artikel over de opstartvolgorde van een typische iOS-applicatie. In dit artikel vertelt hij over de verschillende betrokken componenten en hun rol tijdens het starten van de toepassing. Ik beveel ten zeerste aan dit artikel te lezen als je een beter begrip wilt krijgen van de rol van het UiApplication zowel klasse als het mysterieuze hoofd() functie in main.m.


Het gedelegeerde patroon

Het deelnemerspatroon wordt veel gebruikt in Cocoa en Cocoa Touch. In het volgende artikel van deze serie, waarin we de ins en outs van een tabelweergave verkennen, zul je ontdekken dat tabelweergaven sterk afhankelijk zijn van het patroon van de gedelegeerde (en gegevensbron).

Net als het MVC-patroon is delegatie gebruikelijk in objectgeoriënteerde programmering. Het deelnemerspatroon in Cocoa Touch wijkt echter enigszins af, omdat het gebruikmaakt van een deelnemersprotocol om het gedrag van het deelnemersobject te definiëren.

Laten we verder gaan en de tabelweergaven bekijken. Als je enige tijd met een iPhone of iPad hebt doorgebracht, dan is de UITableView klas moet je bekend voorkomen. Het presenteert een geordende lijst van gegevens aan de gebruiker en het doet dit werk zeer goed.

Hoe weet een tabelweergave wat te doen als er op een rij wordt getikt? Is dit gedrag opgenomen in de UITableView klasse? Zeker niet, omdat dit gedrag varieert van applicatie tot applicatie. Als we dit gedrag zouden opnemen in de UITableView klasse, zou het niet erg herbruikbaar zijn.

Het tabeloverzicht uitbesteedt deze verantwoordelijkheid voor een gedelegeerd object. Anders gezegd, het gedelegeerden deze taak naar een ander object, a delegeren voorwerp. Neem even de tijd om de klasreferentie van de UITableView klasse. Het heeft twee eigenschappen genaamd databron en delegeren. De delegeren wordt door de tabelweergave gemeld telkens wanneer een gebruiker op een rij tikt. Het is de verantwoordelijkheid van het gedelegeerde object om te reageren op de tik van de gebruiker.

De gegevensbron van de tabelweergave is qua gedrag vergelijkbaar. Het belangrijkste verschil is dat de tafelweergave vraagt het gegevensbronobject voor iets, de gegevens die moeten worden weergegeven.

Delegeren en gegevensbronobjecten, zoals de tabelweergave delegeren en databron objecten, zijn bijna altijd aangepaste klassen, klassen die u maakt, omdat hun implementatie toepassingsspecifiek is.

Voordat we naar de TSPAppDelegate klasse, is het belangrijk om te begrijpen dat een gedelegeerd object voldoet aan een gedelegeerd protocol. In het vorige artikel hebben we al geleerd over protocollen in Objective-C en hoe ze gedrag definiëren door een lijst met methoden te definiëren voor de adopters om dit te implementeren.


De toepassingsafgevaardigde

Nu we weten wat delegatie is, is het tijd om de TSPAppDelegate klasse die Xcode voor ons heeft gemaakt. Bij het starten van de toepassing maakt de toepassing een exemplaar van de TSPAppDelegate klasse. U hoeft een toepassingsdelegatieobject meestal nooit expliciet te instantiëren.

Open het header-bestand van de TSPAppDelegate klas (TSPAppDelegate.h) om de inhoud te onderzoeken. Als we de opmerkingen aan de bovenkant negeren, importeert de eerste regel de headerbestanden van het UIKit-framework zodat we kunnen werken met klassen en protocollen.

#importeren 

De volgende regel moet bekend zijn. Dit is het begin van de interface van de TSPAppDelegate klasse zoals aangegeven door de @interface richtlijn. Het specificeert de naam van de klasse en de superklasse van de klasse, UIResponder.

Tussen punthaken zijn de protocollen waaraan de klasse voldoet. De TSPAppDelegate klasse voldoet aan één protocol, de UIApplicationDelegate protocol.

@interface TSPAppDelegate: UIResponder 

De volgende regel is een eigenschapsverklaring, die er bekend uit zou moeten zien. Het eigendom, venster, is een instantie van UIWindow, welke een subklasse is van UIView. De woorden tussen haakjes, sterk en nonatomic, zijn optionele eigenschapsattributen die de opslagsemantiek en het gedrag van de eigenschap specificeren. Je kunt ze nu negeren.

@property (sterk, niet-atomisch) UIWindow * -venster;

Het meest interessante deel van de interface van de TSPAppDelegate klasse is het UIApplicationDelegate protocol. Bekijk de referentie van de UIApplicationDelegate protocol voor een volledige lijst van de methoden die het protocol definieert.

Het protocol definieert tientallen methoden en ik moedig je aan om er een paar te verkennen om een ​​idee te krijgen van de mogelijkheden van het protocol. De methode die op dit moment voor ons het meest interessant is, is toepassing: didFinishLaunchingWithOptions:.

Wanneer de UiApplication instantie klaar is met het voorbereiden van de aanvraag voor lancering, zal het de gedelegeerde op de hoogte brengen, onze TSPAppDelegate bijvoorbeeld dat de toepassing het starten zal beëindigen, maar dat dit nog niet is gebeurd.

Waarom stelt het de gedelegeerde van de toepassing op de hoogte van dit evenement? De UiApplication bijvoorbeeld meldt zijn gedelegeerde over deze gebeurtenis zodat deze de gelegenheid heeft zich voor te bereiden op het starten van de toepassing. Ga naar het implementatiebestand van TSPAppDelegate om te zien wat ik bedoel. De eerste methode in het implementatiebestand is toepassing: didFinishLaunchingWithOptions: en het moet er min of meer uitzien zoals hieronder is geplakt.

- (BOOL) applicatie: (UIApplication *) applicatie didFinishLaunchingWithOptions: (NSDictionary *) launchOptions return YES; 

De toepassing: didFinishLaunchingWithOptions: methode geeft een verwijzing naar de UiApplication exemplaar en een woordenboek met opties, die op dit moment niet van belang zijn voor ons. De implementatie van de methode is vrij eenvoudig. Het enige dat het doet is terugkeren JA om het te vertellen UiApplication bijvoorbeeld dat de applicatie klaar is om te starten.

storyboard

Het Xcode-project bevat nog een interessant bestand, Main.storyboard. Het storyboard bepaalt hoe de gebruikersinterface van onze applicatie eruit zal zien. Standaard wordt het storyboard genoemd Main.storyboard. Selecteer het storyboard om het te openen.

Het storyboard bevat momenteel één weergave in de centrale werkruimte. Rechts van de Project Navigator u kunt een lijst met items zien, dit zijn de objecten die u in de weergave ziet. Het bovenste item heeft de naam Bekijk Controller Scene, die een gelabeld item voor kinderen bevat Bekijk Controller.

De Bekijk Controller object heeft ook een aantal onderliggende items, maar er is er een die voor ons van bijzonder belang is, het object met de naam Uitzicht. Denk aan onze discussie over het MVC-patroon. Hier ziet u het MVC-patroon in actie. Het model ontbreekt op dit moment, maar we hebben wel een mening, de Uitzicht object en een controller, de Bekijk Controller voorwerp.

Wanneer onze applicatie wordt gestart, wordt het storyboard gebruikt om de gebruikersinterface van de toepassing te maken. De view controller wordt automatisch geïnstantieerd en dit is ook het aanzicht van de view controller. De Uitzicht object in het storyboard wordt beheerd door de view controller.

Wacht even. Waar vind ik de klasse van de view controller in het storyboard? Hoe kan ik zijn gedrag wijzigen om een ​​unieke applicatie te maken? Selecteer de Bekijk Controller object aan de linkerkant in het storyboard en open de Identiteitsinspecteur aan de rechterkant.

De Identiteitsinspecteur vertelt je alles wat je moet weten. Aan de bovenkant, in de sectie Aangepaste klasse, je ziet de naam van de klasse van de view controller, TSPViewController. Is het je opgevallen dat de twee bestanden waar we nog niet over gesproken hebben dezelfde naam hebben? We zullen deze bestanden in enkele ogenblikken onderzoeken.

De view controller wordt voor ons geïnstantieerd, omdat het de initiële view controller van het storyboard is. Dit wordt in het storyboard aangegeven door de pijl die naar het storyboard wijst.

UIViewController

Als je opent TSPViewController.h, je zult merken dat het TSPViewController class is een subklasse van UIViewController. Net zoals TSPAppDelegate, de UIViewController class is een subklasse van UIResponder. View controllers of subklassen daarvan vallen in de controleur categorie van het MVC-patroon. Zoals de naam al aangeeft, bepalen ze een weergave, een instantie van de UIView klasse, die valt in de uitzicht categorie van het MVC-patroon.

Een view-controller beheert een weergave en de subvisies van de weergave zoals we later zullen zien. Om dit te doen, moet de view controller van het uitzicht op de hoogte zijn. Met andere woorden, het moet een verwijzing naar de weergave hebben.

De weergavecontroller in het storyboard heeft een verwijzing naar de weergave. U kunt dit controleren door de view controller in het storyboard te selecteren en de Verbindingen Inspecteur aan de rechterkant.

In de Verbindingen Inspecteur, je zou een sectie moeten zien met de naam Outlets. De term outlet is een chique woord voor een eigenschap, die u in het storyboard kunt instellen. Beweeg met je muis over de genoemde outlet uitzicht en kijk hoe de weergave in de werkruimte is gemarkeerd. Dat is de verbinding tussen de view controller en de view.


UIView

Ook al kan uw applicatie slechts één exemplaar van hebben UIWindow, het kan veel weergaven hebben. De UIView klasse is een belangrijk onderdeel van het UIKit-framework, omdat veel klassen er van erven - direct of indirect.

opnieuw bezoeken Main.storyboard door het te selecteren en een kijkje te nemen op de Objectbibliotheek onderaan de Inspecteur.

Blader door de Objectbibliotheek en sleep een label en een knop naar het zicht in de werkruimte. Het maakt niet uit waar u ze in de weergave plaatst, zolang ze in het zicht van de view controller staan.

U hebt gemerkt dat er twee nieuwe objecten zijn toegevoegd aan de Voorwerpen sectie aan de linkerkant. Zowel het label (UILabel) en de knop (UIButton) erven van UIView. Heb je gemerkt dat het Label en Knop objecten zijn iets ingesprongen in vergelijking met de Uitzicht voorwerp? Dit geeft aan dat de Label en Knop objecten zijn subbeelden van de Uitzicht voorwerp. Een weergave kan een of meer subweergaven hebben die worden beheerd.

Zoals ik eerder al zei, de UIView klasse is een belangrijk onderdeel van UIKit. Een weergave beheert een rechthoekig gebied of frame op het scherm. Het beheert de inhoud van het gebied, de subweergaven en alle interacties met de inhoud van de weergave. De UIView class is een subklasse van UIResponder. Je leert veel meer over meningen over de loop van deze serie.


Outlets

Laten we een voorbeeld bekijken om de relatie tussen het storyboard, de weergave die het bevat en de weergavecontroller te illustreren. Deze drie componenten zijn belangrijk en ik wil ervoor zorgen dat je begrijpt hoe ze samenwerken.

Een paar minuten geleden heb je een label en een knop toegevoegd aan de weergave van de view controller. Hoe weet de view controller over deze objecten? Op dit moment verschijnen ze niet in de Verbindingen Inspecteur, maar we kunnen dat veranderen door de view controller over hen te vertellen.

Open het header-bestand van de view controller (TPSViewController.h) en voeg een eigenschap toe voor het label en voor de knop.

@property IBOutlet UILabel * myLabel; @property IBOutlet UIButton * myButton;

Door de IBOutlet sleutelwoord voor de eigendomsverklaring, de eigenschappen verschijnen in de Connections Inspector in het storyboard en dat is wat we willen.

Ga terug naar het storyboard, selecteer de Bekijk Controller object in de Bekijk Controller Scene, en open de Verbindingen Inspecteur aan de rechterkant. De nieuwe eigenschappen worden nu vermeld in de lijst van Outlets. De view controller heeft echter nog niet de verbinding tussen de nieuwe eigenschappen en de objecten in het storyboard.

Dit is gemakkelijk te verhelpen. Sleep van de lege cirkel aan de linkerkant van de mylabel stopcontact naar het label in de werkruimte. Hiermee wordt die allerbelangrijkste verbinding gemaakt, zodat de view controller weet van het label. Doe hetzelfde voor de knop.

Hoewel we de tekst van het label in het storyboard kunnen wijzigen, laten we dit in de view-controller doen om te illustreren dat de view-controller toegang heeft tot het label en de knop in het storyboard.

Open het implementatiebestand van de view controller (TPSViewController.m) en zoek naar de viewDidLoad methode. Wijzig de viewDidLoad methode om de onderstaande implementatie te weerspiegelen. De opmerkingen zijn weggelaten omwille van de duidelijkheid.

- (void) viewDidLoad [super viewDidLoad]; [self.myLabel setText: @ "Dit is een exemplaar van UILabel."]; 

We kunnen berichten naar de labelproperty sturen door de view controller te vragen, zelf, voor zijn mylabel eigendom. Door de mylabel eigenschap een bericht van setText: en een letterlijke tekenreeks doorgeven, werken we de tekst van het label bij.

Let daar op setText: is een accessor of een zetter. Hoewel het mogelijk is om de puntnotatie van Objective-C te gebruiken (zie hieronder), heb ik de meer traditionele syntaxis gebruikt omdat het u beter laat zien wat er daadwerkelijk gebeurt.

self.myLabel.text = @ "Dit is een voorbeeld van UILabel";

Start uw applicatie in de iOS Simulator door op te klikken Rennen knop in de linkerbovenhoek en merk op dat de tekst van het label inderdaad is bijgewerkt.


acties

We hebben veel nieuwe dingen onderzocht in dit artikel. Ik wil deze aflevering beëindigen door over acties te praten. Net als verkooppunten zijn acties niets meer dan methoden die je op het storyboard kunt zien.

Laten we kijken hoe dit werkt. Open het header-bestand van de view controller (TPSViewController.h) en voeg de volgende methodeverklaring ergens toe in het interfaceblok van de view-controller.

- (IBAction) changeColor: (id) afzender;

Wees niet in de war door de IBAction trefwoord. IBAction is identiek aan leegte, wat betekent dat de methode geen waarde retourneert. Als we de methode-declaratie van dichterbij bekijken, kunnen we zien dat er één argument van het type nodig is ID kaart, een verwijzing naar een Objective-C-object.

Zoals de argumentnaam aangeeft, is het argument van de methode of actie het object dat het bericht naar de view controller heeft verzonden. Ik zal dit in meer detail in meer detail uitleggen.

Bezoek opnieuw het storyboard, selecteer de Bekijk Controller object in de Bekijk Controller Scene, en open de Verbindingen Inspecteur. Een nieuw gedeelte is verschenen in de Verbindingen Inspecteur genaamd Ontvangen acties en de actie die we zojuist hebben toegevoegd, staat in deze sectie.

Sleep van de lege cirkel aan de linkerkant van de actie naar de knop in de werkruimte. Een klein venster met een lijst met opties zou moeten verschijnen. De lijst bevat alle mogelijke gebeurtenissen waarop de knop kan reageren. Degene die ons interesseert is Touch Up Inside. Deze gebeurtenis wordt geactiveerd wanneer een gebruiker de knop aanraakt en zijn vinger opheft terwijl hij zich nog in de knop bevindt.

Bouw en voer je applicatie opnieuw uit en tik op de knop. Is de applicatie ook voor jou gecrasht? Hoe is dit gebeurd? Toen je op de knop tikte, werd er een bericht van verzonden verander kleur: naar de view controller. Hoewel de view controller een declareert verander kleur: methode wordt deze methode nog niet geïmplementeerd.

Telkens wanneer een bericht wordt verzonden naar een object dat geen overeenkomstige methode implementeert, wordt er een uitzondering gemaakt en crasht het programma als de uitzondering niet wordt opgevangen. U kunt dit controleren door de toepassing nogmaals uit te voeren, op de knop te tikken en de uitvoer in het consolevenster te inspecteren.

Om dit te verhelpen, moeten we het verander kleur: methode. Open het implementatiebestand van de view controller (TPSViewController.m) en voeg de volgende methode-implementatie ergens toe in het implementatieblok.

- (IBAction) changeColor: (id) afzender NSLog (@ "Sender Class>% @", [afzenderklasse]); NSLog (@ "Sender Superclass>% @", [afzender superklasse]); int r = arc4random ()% 255; int g = arc4random ()% 255; int b = arc4random ()% 255; UIColor * color = [UIColor colorWithRed: (r / 255.0) groen: (g / 255.0) blauw: (b / 255.0) alpha: 1.0]; [self.view setBackgroundColor: color]; 

De implementatie van de verander kleur: methode is identiek aan degene die we eerder in deze serie hebben gebruikt. Ik heb er echter twee extra toegevoegd NSLog roept de uitvoering ervan op om u te laten zien dat de afzender van het bericht inderdaad de knop is die we aan het storyboard hebben toegevoegd.

De methode zelf is vrij eenvoudig. We genereren drie willekeurige gehele getallen tussen 0 en 255, geef deze waarden door aan colorWithRed: groen: blauw: alpha: om een ​​willekeurige kleur te genereren en de achtergrondkleur van de weergave van de weergavecontroller bij te werken met de willekeurig gegenereerde kleur.

Let daar op self.view refereert aan de visie die de view controller beheert en die we eerder in het storyboard zagen.

Bouw en run je applicatie nog een keer, tik op de knop en vergeet niet om de uitvoer in het consolevenster van Xcode te inspecteren. U zult opmerken dat de afzender er een is van UIButton en zijn superklasse is UIControl.


Conclusie

In dit artikel hebben we enkele klassen van het UIKit-framework verkend en hebben we de verschillende componenten van een iOS-applicatie onder de loep genomen. In de rest van deze serie zullen we het UIKit-framework in meer detail verkennen en ermee werken.

Als je de verschillende concepten en patronen niet volledig begrijpt, dan weet ik zeker dat je dat zult doen naarmate de serie vordert. Aarzel niet om een ​​reactie achter te laten als je vragen hebt over dit artikel.