Överföring av data mellan kontroller i Swift

Om Swift

Swift är ett fantastiskt programmeringsspråk som Apple introducerade under WWDC 2014, och nu använder nästan alla Apple-utvecklare det för att programmera iOS och OS X-program. Det är mycket flexibelt, lättare att använda än föregångaren Objective C, och det kommer att spara dig några värdefulla minuter när du kodar med XCode.

Detta är ett kraftfullt och intuitivt programmeringsspråk för iOS, OS X, tvOS och watchOS. Skriva Swift-koden är interaktiv och rolig, syntaxen är kortfattad men uttrycksfull, och Swift innehåller moderna funktioner utvecklare kärlek. Om du inte använder Swift redan, kolla in några av våra andra bra handledning på Swift-språk:

Om den här handledningen

För det mesta måste du, när du bygger en iOS-app med mer än en skärm, skicka data mellan dina View Controllers för att de ska kunna dela innehållet utan att förlora dem på vägen. I den här handledningen lär du dig hur du gör det. Vi kommer att använda en Sträng, en Heltal, och även a UIImage, så fortsätt läsa - du kommer bli förvånad över hur lätt det här jobbet är med Swift.

XCode Project Setup

Först och främst skapa ett nytt XCode-projekt. Välja Enkel visningsprogram och namnge projektet men du vill. Du hittar en ViewController.swift filen i fillistan på panelen till vänster och ett styrgränssnitt i Storyboard.

Börja med att dra en ny visningskontrollör från objektbiblioteket till din Storyboard.

Bädda in din första kontroller till en NavigationController, så när du trycker på nästa styrenhet visas toppraden som standard Tillbaka knapp. Välj nu den första kontrollen i Storyboard och klicka på Redaktör > Bädda in ... > Navigation Controller.

Lägg nu till en UILabel och a UIButton till regulatorn. Du kan hitta dem i Objekt-biblioteket och dra dem till din första kontroller. Dubbelklicka sedan på UILabel och skriv texten du vill skicka till den andra kontrollenheten. Jag har just satt sin text till "Text att passera".

På den andra kontrollen drar du en ny UILabel var som helst du vill och lämna texten precis som den är.

Vi har nu att skapa en ny .snabb fil och bifoga den till vår andra kontroller. Så högerklicka i listrutan för filer till vänster, klicka på Ny fil… , Välj Kakao Touch Class från iOS-källa kategori, klicka Nästa, och namnge den nya vynkontrollen SecondVC. (Inga mellanslag är tillåtna i namnet, och det måste börja med en bokstav.)

Nu måste du länka den andra Controller i Storyboard med din nya SecondVC.swift fil. Välj den gula cirkeln högst upp på kontrollenheten, klicka på Identifiera inspektör panelikon på höger sida av XCode-fönstret och skriv namnet på ditt nya .snabb fil i Klass och StoryboardID fält.

Ansluta visningar till .swift-filerna

Dela XCode-fönstret i två delar genom att klicka på Assistentredaktör knappen i det övre högra hörnet. Nu har du Storyboard till vänster och dess relevanta .snabb filen på höger sida.

Anslut UILabel som en IBOutlet och den UIButton som en IBAction till din .snabb fil genom att hålla höger musknapp (eller Kontrollera knapp och musknapp) över dessa vyer och dra den blå linjen precis under klass deklaration.

När du släpper ut musen kan du ge namnet på etikettens uttag och till knappens åtgärd i den lilla grå popupen som dyker upp. För knappen, se till att klicka på den lilla kombinationsrutan som säger Utlopp och byt den in i Verkan, eftersom vi behöver det för att vara en funktion, inte ett uttag.

När du är klar med att ansluta alla synpunkter, håll ditt XCode-fönster delat i två sektioner och välj den första kontrollen från Storyboard. Nu visar höger sida ViewController.swift filen och du är redo att skriva en kod i den.

Låt oss koda!

Placera följande kod i goButton () metod.

låt myVC = storyboard? .instantiateViewControllerWithIdentifier ("SecondVC") som! SecondVC myVC.stringPassed = myLabel.text! navigationController? .pushViewController (myVC, animerad: true)

Den första raden instanserar SecondVC controller från Storyboard. 

Den andra raden är faktiskt kärnan i denna handledning, eftersom den tilldelar myLabels text till UILabel vi har lagt in i SecondVC kontrollant. Det gör det genom att ställa in en Sträng att vi är gong att förklara senare.

Slutligen trycker vi helt enkelt på vyn till nästa kontroller.

Passerar en sträng

Välj nu den andra kontrollen i Storyboard och lägg till denna variabel precis under SecondVCklassdeklaration:

var stringPassed = ""

Gör appen tilldela värdet för denna variabel till secondLabel med följande rad kod i viewDidLoad () metod.

secondLabel.text = stringPassed

Du är klar! Kör appen på iOS-simulatorn eller en riktig enhet, tryck på GÅ! och du borde få något så här:

Som du kan se, är Text att passera Sträng har framgångsrikt vidarebefordrats till vår SecondVC kontrollant.

Passerar en helhet

Låt oss nu försöka lägga till en helhet (int i Swift) och dela den mellan de två kontrollerna. 

Lägg till följande variabel till ViewController.swift, strax under myLabel Outlets deklaration.

var myInt = Int ()

Initiera sitt värde i viewDidLoad ():

åsidosätta func viewDidLoad () super.viewDidLoad () myInt = 5

Därefter redigerar du goButton () funktion genom att lägga till en instans som också passerar vår myInt värdet till nästa kontroller, enligt följande:

låt myVC = storyboard? .instantiateViewControllerWithIdentifier ("SecondVC") som! SecondVC myVC.stringPassed = myLabel.text! myVC.intPassed = myInt navigationController? .pushViewController (myVC, animerad: true)

Gå nu in SecondVC.swift och lägg först till en variabel av typen int som kommer att få numret som vi skickar från den första kontrollenheten. Placera denna rad kod direkt under stringPassed variabel.

var intPassed = Int ()

Redigera secondLabel kod enligt följande:

secondLabel.text = stringPassed + "min Int: \ (intPassed)"

Det är allt. Kör appen igen och tryck på GÅ! knappen, och du borde få något så här:

Så nu ser du hur lätt det är att skicka variabler från en controller till en annan. Det sista jag vill visa är hur man ska skicka en bild.

Passerar en bild

Nästa måste vi lägga till en bild i Tillgångarmapp i XCode, a UIImageView i båda styrenheterna och deras relativa variabler av typen UIImage.

Gå in i Assets.xcassets blå mapp och skapa en ny Bildsats.

Dra 3x, 2x och 1x bilderna i sina relativa lådor. Du är fri att använda någon bild. Jag har använt en Apple-logotyp som ett exempel.

Gå tillbaka till den första kontrollen i Storyboard och dra a UIImageView var som helst i den. Fäst din bild till den med panelen Attributes inspektör och ställ in dess Läge till Aspect Fit.

Dra nu en ny UIImageView in i den andra styrenheten och ställa in dess Läge till Aspect Fit. Tilldela inte någon bild till det, eftersom vi kommer att överföra bilden från den första kontrollenheten!

Högerklicka på musen (eller håll kvar Kontrollera och klicka på musknappen) och dra en blå linje i den första kontrollerns .snabb fil att deklarera din UIImageView som en IBOutlet. Gör samma sak också på den andra kontrollenheten.

Nu måste du lägga till en UIImage variabel till SecondVC.swift fil. Placera den under intPassed variabel.

var theImagePassed = UIImage ()

viewDidLoad (), Ta tag i bilden som passerat av den första kontrollen och visa den med imagePassed.

imagePassed.image = theImagePassed

Ändra ändå goButton () metod genom att lägga till en rad kod som passerar bilden av den första kontrollenheten i UIImageView av den andra. Hela goButton () Metoden är nu enligt följande.

låt myVC = storyboard? .instantiateViewControllerWithIdentifier ("SecondVC") som! SecondVC myVC.stringPassed = myLabel.text! myVC.intPassed = myInt myVC.theImagePassed = myImage.image! navigationController? .pushViewController (myVC, animerad: true)

Kör appen, tryck på GÅ! knappen igen, och du borde se något så här:

Tack för att du följer med! Jag hoppas att du är förvånad över hur lätt det är att utbyta variabler och bilder mellan två controllers. 

Lär dig Swift

Vi har byggt en komplett guide för att hjälpa dig att lära dig Swift, oavsett om du bara har börjat med grunderna eller vill utforska mer avancerade ämnen.

Du kan också kolla in några av våra andra handledning på Xcode och Swift!