App maken: ook jij kunt het leren!

 

de iOS Academie Forums

Forums - App-ontwikkeling - Swift en iOS: Informatie delen met viewControllers in een ScrollView

Bart  Op de eerste vier stappen van zijn/haar studiekaart scoort Bart 36%. Klokje03 jun 2016, 17:29
Avatar
Avatar
Berichten:17


Ik heb een scrollView gemaakt die verschillende viewControllers toont. De gebruiker kan hierdoor vegen en alles bekijken. Echter is het de bedoeling dat wanneer in een bepaalde viewController in deze scrollView er iets gebeurt er ook een actie (tekst aanpassen,...) in een andere viewController van dezelfde scrollView kan gebeuren.

De extra viewControllers heb ik grafisch gemaakt via een XIB bestand en hun code staat in de bijhorende CocoaTouch bestand. 

Ik krijg het maar niet voor elkaar om een actie in een bepaalde viewController door te geven aan een andere viewController.

Ik dacht het op te lossen met deze code:

actie naar andere viewController

let destination = ViewControllerWeb1(nibName: "ViewControllerWeb1", bundle: nil)

destination.labelHoofding.text = "nieuwe tekst"

Maar bij het uitvoeren van deze code krijg ik steevast een 

unexpectedly found nil while unwrapping an Optional value

Ik heb geen idee hoe ik dit probleem nu moet oplossen.

Reageer


Prunus  Op de eerste vier stappen van zijn/haar studiekaart scoort Cor 55%. Klokje05 jun 2016, 15:41
Avatar
Avatar
Berichten:84


Bart,

IK heb niet de oplossing in pacht voor je code, ik ken deze manier niet. Ik zou het met segues doen. Ik weet wel dat deze foutboodschap in 99% van de gevallen voorkomt als er een label is zonder outlet of een outlet zonder label. De betreffende variabele moet bijvoorbeeld in beide viewControllers voorkomen.

Maak even een breakpoint om te zien welke variabele het betreft c.q. waar het precies fout gaat

Reageer

Goed advies! 1 persoon vindt dit goed advies.

Admin Roelf  Klokje05 jun 2016, 16:56
Avatar


Bart, dit is een klassieke instinker. Het zit als volgt.

Je maakt een nieuwe viewcontroller door hem uit een nib te halen. Op dat moment is er weliswaar een instantie van die viewcontroller, maar de bijbehorende view en subviews zijn nog niet gemaakt! Dit betekent dat ook eventuele outlets nog nil zijn. En precies dat is de oorzaak van je probleem: .labelHoofding is ongetwijfeld een outlet naar een nog niet door iOS gemaakt label. Die outlet is dus nil. En omdat je bovendien geen optional chaining gebruikt (destination.labelHoofding?.text), krijg je een crash.

De oplossing:

1. Gebruik een property in je ViewControllerWeb1 waarin je de tekst kunt opslaan die je in het label wilt hebben. Noem hem bijvoorbeeld 'labelHoofdingTekst' of iets dergelijks. Die property is al wél beschikbaar zodra je een instantie hebt gemaakt.

2. Geef aan die property, op de plek waar je nu probeert om labelHoofding te zetten, de juiste tekst: destination.labelHoofdingTekst = "nieuwe tekst"

3. In .viewDidLoad() van je ViewControllerWeb1: gebruik de .labelHoofdingTekst-property om de juiste tekst in je label te zetten: self.labelHoofding.text = self.labelHoofdingTekst.

Da's alles. Succes!

 

Reageer


Bart  Op de eerste vier stappen van zijn/haar studiekaart scoort Bart 36%. Klokje05 jun 2016, 18:45
Avatar
Avatar
Berichten:17


Bedankt Roelf,

 

Ik krijg het nu aan de praat ;-)

Het blijft toch wel iets moeilijk om te communiceren tussen de view controllers. Daar zouden ze toch een handigere oplossing voor moeten bedenken.

Reageer