iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   Uitlezen 'variabelen' tussen 'views' (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/32450-uitlezen-variabelen-tussen-views.html)

Malork 03-04-09 09:02

Uitlezen 'variabelen' tussen 'views'
 
Wellicht is het supersimpel, maar kan iemand mij vertellen hoe je waardes vanuit verschillende views kan benaderen?

Voorbeeld: ik heb een rootViewController die een instantie van 'settingsViewController' initialiseert en een instantie van 'uitleesViewController' heeft. Nu wil ik de waarde, stel, een naam in een UITextField die ik in settingsViewController heb ingevoerd, uitlezen / tonen in bijvoorbeeld een UILabel in uitleesViewController.

De views kunnen elkaar uiteraard niet direct aanroepen omdat het instancies zijn die geinitieerd zijn vanuit mijn rootViewController, dus neem ik aan dat het via de rootViewController gaat..of sla ik de plank nu mis?

Op iphonedevsdk ben ik wel soortgelijke vragen ook tegengekomen, maar daar kwam ik niet echt mee weg.

Alvast bedankt voor diegenen die mij mijn 'oh ja, doh! dat ik zo stom ben dat ik dat niet zie!' moment geeft.

EDIT: Na gisteravond gespeeld te hebben blijkt, als ik het goed heb, te gaan middels een UIApplication-class die je in je views include, en instantieert via UIApplication *mijnDelegates = [[UIApplication sharedApplication] mijnDelegates];

Hierin definieer je dan je 'globale variabelen' zodat elke view middels deze 'delegate' ze kan benaderen.

ideveloper 03-04-09 10:50

Zo kun je het oplossen idd. Je kunt ook zorgen dat je uitleesViewController van de settingsViewControler weet. Dus je kunt bijvoorbeeld in de settingsViewController een attribuut uitleesViewController geven en deze tijdens het initialiseren zetten. Dan kun je altijd bij je uitleesViewController vanuit je settingsViewController zonder dat je dit via de sharedApplication hoeft te doen.

Malork 03-04-09 10:58

toch? ik dacht dat dat niet ging omdat beide Controllers vanuit de rootController geinstantieerd werden. Volgens mij had ik dat ook al eens geprobeerd maar werkte het niet omdat bijvoorbeeld uitleesViewController een nieuwe instance maakte van settingsViewController; dan heb ik dus blijkbaar iets verkeerd gedaan...

sossienl 03-04-09 11:53

Ik doe het als volgt:

- Mijn eerste view is een Table View, onder function tableView didSelectRowAtIndexPath

DetailerViewController *dvController = [[DetailerViewController alloc] initWithNibName:@"DetailerView" bundle:[NSBundle mainBundle]];
dvController.selectedCountry = storyLink;
dvController.selectedHalte = storyHalte;
dvController.selectedPostal = storyPostal;
dvController.selectedPrepre = storyPrePre;

[self.navigationController pushViewController:dvController animated:YES];
[dvController release];
dvController = nil;



In mijn tweede View het volgende;

@synthesize selectedCountry;
@synthesize selectedHalte;
@synthesize selectedPostal;
@synthesize selectedPrepre;


Tevens declare ik ze in de header file

Geen idee of dit hierboven al beknopt benoemd was, just my 2 cents.

Matisse 03-04-09 12:46

Kijk anders ook eens naar "key-value observing". Je registreert je dan zogezegd voor notificaties die gestuurd worden als die bapaalde variabele wijzigt, zo verklein je ook de interface tussen beide controllers.

Malork 03-04-09 13:56

Werkt key value observing ook op de iPhone dan? Dat zou interessant zijn (dacht dat dit alleen met Mac OSX werkte).

In ieder geval iedereen bedankt; ik weet nu dat ik niet helemaal verkeerd zat en dat er verschillende methodes zijn (en Sossie, bedankt voor je voorbeeld!). Dat worden weer late dagen dit weekend!

Thaurin 03-04-09 14:29

Ik ben nog niet met multiple views aan de slag geweest, maar kun je niet gewoon een connectie leggen tussen rootViewController en settingsViewController, deze #import'en in settingsViewController en zo een outlet in rootViewController benaderen?

Malork 03-04-09 15:18

nou, je hebt eigenlijk 3 viewcontrollers: een rootViewController, een settingsViewController en een uitleesViewController. rootVC instantieert de andere 2 controllers en regels het switchen tussen deze 2 views.
Als je dus settingsViewController in uitleescontroller import en instantieert, maak je dus een nieuwe instance (object) met zijn eigen runtime-variabelen, dus dat werkt niet (althans, in PHP niet...).
Daarom zei ik al: misschien is het heel eenvoudig en zie ik iets over het hoofd, want in eerste instantie had ik jouw idee ook in gedachte, maar dat werkt (als je nadenkt over de basis OOP) niet, maargoed, Objective-C heeft me wel vaker verrast.

Thaurin 03-04-09 15:22

Kan settingsViewController de instance van rootViewController dan niet benaderen? In dat geval kan settingsViewController toch gewoon [rootViewController uitleesViewController] lezen via een outlet?

Ik refereer aan de switching views video tutorial.

Malork 03-04-09 15:34

Citaat:

Oorspronkelijk geplaatst door Thaurin (Bericht 274410)
Kan settingsViewController de instance van rootViewController dan niet benaderen? In dat geval kan settingsViewController toch gewoon [rootViewController uitleesViewController] lezen via een outlet?

Oh zo bedoel je; ja daar had ik ook snel aan gedacht maar niet geprobeerd; je bedoelt dus een UIApplication in de uitleesViewController XIB plaatsen en dan zo koppelen. Theoretisch maakt ie dan ook weer een aparte instance aan van rootViewController, toch?

Met dat sharedApplication komt het nagenoeg in de buurt wat jij bedoelt maar dat is programmatig.

Thaurin 03-04-09 15:49

Als settingsViewController en uitleesViewController in dezelfde xib staan, en hun views worden geplaatst op de view van rootViewController, kun je in IB toch gewoon outlets tussen de verschillende view controllers maken? En aangezien rootViewController instanties van settingsViewController en uitleesViewController bevat, kun je hier toch gewoon outlets voor maken? Zodat je een connectie kunt maken in IB tussen rootViewController en settingsViewController? En dan dus uitleesViewController kan benaderen in settingsViewController? :)

Een hoop vragen, maar misschien is de structuur van jouw applicatie compleet anders of heb ik het helemaal fout.

Malork 03-04-09 16:02

Oef mijn hoofd duizelt ervan :) maar alle views zijn aparte XIB-files. Dat idee had ik ook zo'n beetje inderdaad, echter als je straks een applicatie hebt met misschien wel 10 views, dan krijg je een wirwar, lijkt me, maar het is zeker het proberen waard en zou best wel eens ergens van toepassing kunnen zijn.

Ik bedoelde eigenlijk met mijn OP meer iets wat vergelijkbaar is met bijvoorbeeld globals of sessievariabelen in PHP, die 'zweven' en zijn door elke class te benaderen.

mijn hoofd duizelt ervan :)

Thaurin 03-04-09 16:19

Aha, de video die ik linkte maakt dus geen aparte XIB voor iedere view. Hij zegt dat hij dit voor kleinere apps fijner vindt, maar grotere apps werken efficienter met aparte XIBs, aldus de goede man.

Ik ga hier thuis even mee puzzelen.

Malork 03-04-09 16:33

Oh de video had die je postte had ik niet gezien (de link) via de iPhone; nu wel. zeker interessant om eens naar te kijken.

op iPhonedevSDK staat ook een mooie video, met daaronder een link naar een HQ-versie, maar die is er niet meer en de kwaliteit is te belabberd om er iets uit te halen. Ik zal eens vragen daar of deze video gerepost kan worden.

Matisse 03-04-09 16:50

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 274384)
Werkt key value observing ook op de iPhone dan? Dat zou interessant zijn (dacht dat dit alleen met Mac OSX werkte).

Werkt perfect.

Thaurin 03-04-09 17:27

Citaat:

Oorspronkelijk geplaatst door Malork (Bericht 274425)
Ik zal eens vragen daar of deze video gerepost kan worden.

Dank, ik denk dat deze zaken er niet goed genoeg in kunnen zitten. Dus van zo veel mogelijk kanten met wellicht verschillende perspectieven kan alleen maar goed zijn. :)

Wat betreft key-value observing, ik heb dat eens een keer gezien in een keynote. Zo kun je een control koppelen aan een ander object, en als de waarde (bijvoorbeeld een slider) veranderd, veranderd een waarde in het object automatisch mee. Weinig code, snel in elkaar gezet. Klinkt erg leuk, alhoewel er mensen zijn die zweren dat we zo snel mogelijk van Interface Builder af moeten en zo veel mogelijk in code moeten doen. ;)

Malork 03-04-09 17:56

Citaat:

Oorspronkelijk geplaatst door Thaurin (Bericht 274440)
Dank, ik denk dat deze zaken er niet goed genoeg in kunnen zitten. Dus van zo veel mogelijk kanten met wellicht verschillende perspectieven kan alleen maar goed zijn. :)

Wat betreft key-value observing, ik heb dat eens een keer gezien in een keynote. Zo kun je een control koppelen aan een ander object, en als de waarde (bijvoorbeeld een slider) veranderd, veranderd een waarde in het object automatisch mee. Weinig code, snel in elkaar gezet. Klinkt erg leuk, alhoewel er mensen zijn die zweren dat we zo snel mogelijk van Interface Builder af moeten en zo veel mogelijk in code moeten doen. ;)

Ja met KVO had ik al eens gespeeld op Mac, was erg 'grappig' om te doen; ben benieuwd hoe het op de iPhone gaat.

de link naar dat wat ik bedoelde op iphonedevsdk is Multiple XIB how-to - iPhone Dev SDK Forum de HD-versie doet het nu wel weer blijkbaar, maar moet je een vimeo-account hebben. de in-post movie is slecht, maar daaronder staat een link naar een wel goed zichtbaar bestand: iPhone Tutorial - Multiple XIB files on Vimeo

...al met al weer genoeg om te lezen / zien / doen, en dit is nog maar één aspect van wat ik allemaal wel niet zou willen weten. Ik moet mezelf maar weer eens gaan afremmen geloof ik ;)

Thaurin 03-04-09 18:11

Bedankt, gelijk effe kijken. Ik ga het uitproberen en kom erop terug. De HD versie deed het trouwens gewoon zonder account.

Ik denk dat het op een gegeven moment ineens zal afremmen, zodra bepaalde zaken gaan overlappen en alles zo'n beetje op z'n plaats valt. Dit uiteraard pas na eerst zelf veel te hebben geëxpirimenteerd. ;)

Malork 03-04-09 20:15

Het is me net op de manier gelukt zoals iDeveloper al beschreef; eigenlijk logisch want in PHP (sorry voor als ik het steeds vergelijk...) doe je het ook zo.

Wat doe ik:

ik heb:
- een rootViewController
- een settingsViewController
- een uitleesViewController

in de uitleesViewController staat in de .h file:

@class settingsViewController

met vervolgens een declaratie:
settingsViewController *settingsVC;

@property (nonatomic, retain) settingsViewController * settingsVC

in de .m-file synthesize ik settingsVC en #import ik de settingsViewController.h
deze uitleesVC synthesize ik ook in de .m-file uiteraard.

tijdens starten van de applicatie laad rootViewController de settingsViewController en toont deze.
Op dit moment kun je dus in settingsViewController je settings doen.
Wanneer ik op een button druk (die verbonden is met een IBOutlet in rootViewController) wordt mijn uitleesViewController geladen. Nadat ik deze heb geinstantieerd passeer ik de pointer die rootViewController heeft voor de settingsViewController naar de uitleesViewController's settingsVC met:

[uitleesVC setSettingsVC:self.settingsVC];

Ik hoop dat het een beetje duidelijk was; gelukkig zijn er dus diverse manieren om gegevens uit te lezen uit andere controllers.

Thaurin 03-04-09 21:04

Aha, dus zodra rootViewController de message krijgt om de views te switchen, geef je gelijk settingsViewController door aan die nieuwe view (uitleesViewController). Ik moet het zelf even proberen om het te solidificeren (in het Engels klinkt dat woord beter :/), maar ik snap de bedoeling.


Alle tijden zijn GMT +2. Het is nu 10:01.