toegang array vanuit andere klasse

toegang array vanuit andere klasse discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) question mensen , gezien globale variabelen niet worden gebruikt in objective c , weet iemand misschien wat de makkelijkste en snelste manier is om toegang ...



Ga terug   iPhone, iPod touch, iPad en Apple TV forum > Development > Ontwikkelen voor iOS
Wachtwoord vergeten? Registreren!
Registreer FAQ Ledenlijst Kalender Zoeken Berichten van vandaag Markeer forums als gelezen
  #1  
Oud 16 June 2009, 17:08
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard toegang array vanuit andere klasse

question mensen , gezien globale variabelen niet worden gebruikt in objective c , weet iemand misschien wat de makkelijkste en snelste manier is om toegang tot een array in een andere klasse te krijgen.
mvg
Advertentie
Advertentie Gesponsorde links (verdwijnt na registratie)

  #2  
Oud 16 June 2009, 18:31
» iPhone 4 32GB (Zwart) [FW: 5.1]  [Jailbreak: Ja]
» iPad 3 Wi-Fi 16GB (Zwart) [FW: 5.1.1]  [Jailbreak: Ja]
» Windows
 
Geregistreerd: 14 June 2009
Locatie: Lienden (a.k.a. the middle of nowhere)
Berichten: 54
Standaard

je kan wel global variables maken, maar dat terzijde...
Kan je niet gewoon zeggen: myVar = myObject.Array[1];?
  #3  
Oud 16 June 2009, 18:39
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Normaal kan je een variabele opvragen via de method "variabele". Het is niet mogelijk om een variabele rechtstreeks aan te spreken vanuit een ander object omdat alle variabelen van een object standaard private zijn in Objective-C (je kan dat veranderen, maar dat wil je eigenlijk niet). Je moet ze dus aanspreken via getter/setter methods. Je moet zelf voor elke variabele die je toegankelijk wilt maken een method variabele en setVariabele: aanmaken. In Objective-C v2 doe dit gemakkelijk door "variabele" via @property te definieren in je .h bestand en @synthesize in je .m bestand. Voorbeeld:

In je .h:
Code:
@interface EenKlasse : NSObject {
  int eenInt;
  NSArray *eenArray;
}

@property (nonatomic, readwrite) int eenInt;
@property (nonatomic, retain) NSArray *eenArray;

@end
In je .m:
Code:
@implementation EenKlasse;

@synthesize eenInt;
@synthesize eenArray;

... rest van je code ...
Daarna kan je in je code eenArray gebruiken om een pointer naar je array te krijgen of eenInt om de waarde van die integer op de vragen.

Code:
EenKlasse *eenKlasse = [EenKlasse alloc] init];

NSArray *array = [eenKlasse eenArray];
NSArray *array = eenKlasse.eenArray; // Alternatieve schrijfwijze

int getal = [eenKlasse eenInt];
Het is overigens niet gebruikelijk dat je die array buiten de klasse waarin hij vermeld staat zomaar aanpast. Dat gaat ook tegen de principes van OO programmeren in. De klasse die je gemaakt hebt beheert de variabelen in die klasse.

Laatst gewijzigd door Myrdhin; 16 June 2009 om 19:09. Reden: Typo
  #4  
Oud 16 June 2009, 18:43
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

mijn dank is groot heren(@oentje mmmm ik dacht dat ik dat had gelezen van die global variables maar ik zal nog een keertje kijken ). @Myrdhin Thnx !.. (ik wil de array zelf niet aanpassen slechts wat waarden eruit halen)

Laatst gewijzigd door ulquiorra; 16 June 2009 om 18:49.
  #5  
Oud 16 June 2009, 19:12
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Nog 1 opmerking over globale variabelen: doe het niet
(afgezien van constante globale variabelen natuurlijk)

Interessant leesvoer: Singletons, AppDelegates and top-level data

Laatst gewijzigd door Myrdhin; 16 June 2009 om 19:15.
  #6  
Oud 17 June 2009, 12:57
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

Ik heb in gedaan wat je zei , echter loop ik toch nog tegen een probleempje op.
Hetgeen wat ik wil bereiken is het volgende:
Ik wil dus een object in mijn array aanspreken en deze toewijzen aan een labelproperty.
dus zoiets
Code:
[aLabel setTitle:[ thisarray objectAtIndex:2]forState:UIControlStateNormal];
Ik heb een parser die aan het begin van het programma een xml bestand doorloopt en waardes opslaat in een array ( en deze wil ik dus gebruiken om bij aLabel te gebruiken).
Ik weet niet of dit de beste methode is maar het zou moeten werken mocht ik dus die array aan de praat krijgen ( ik wil graag mijn parser als aparte klasse houden vandaar deze vraag ).
Ik krijg momenteel de unrecognized selector foutmelding. Dus ik neem aan dat ik een of andere functie moet maken en niet direct mijn array kan toewijzen?
  #7  
Oud 17 June 2009, 15:34
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Waarom laat je je parser geen array terugleveren? Die kan je dan weer overal gebruiken.

Iets als:
Code:
XMLParser *xmlParser = [[XMLParser alloc] initWithContentsOfFile:@"file.xml"];
NSArray *parsedData = [xmlParser parse];
  #8  
Oud 17 June 2009, 18:25
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

Thanks !.. dit zou perfect moeten werken en dat doet het ook. Met deze aanpak kan ik inderdaad de array vanuit de andere klasse aanspreken.
Ik heb dat ook gedaan

Code:
-(NSMutableArray *)testarray 
{
testarray = [[NSMutableArray alloc]  initWithObjects:@"Jantje" , @"Klaasje", nil]

return testarray;
}
Probleem echter is dat mijn array wordt gevuld in foundCharacters ( ik weet niet of je misschien NSXMLparser class ooit hebt gebruikt maar zij hebben een aantal standaard functies waarvan deze er een is ). Helaas heeft deze geen returnwaarde daarom heb ik het bovenste gebruikt om te testen en het werkt.

Code:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if(!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:string];
else
[currentElementValue appendString:string];
[testarray addObject:string];  

NSLog(@"Processing Value: %@", currentElementValue);

}
Het vervelende is dus dat de array nog niet is geinitialiseerd maar dat is een ander probleem je hebt me goed geholpen in ieder geval thanks.
  #9  
Oud 17 June 2009, 21:53
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Je zei dat je een aparte klasse hebt gemaakt voor je parser. In die klasse gebruik je dan NSXMLParser en definieer je ook de delegates zoals
Code:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
Het hele parsen en opbouwen van de array doe je dus in je eigen klasse. Als je dan een method maakt van parsedArray of zoiets dan kan je die opgebouwde array opvragen.

Dus of de array wel of niet gevuld is doet eigenlijk niet terzake volgens mij. Je roept je parser aan en daarna is je array gevuld. Vaak doe je dat soort initiele dingen in je applicationDidFinishLaunching functie.
  #10  
Oud 17 June 2009, 22:22
danielpunt's schermafbeelding
» iPhone 3G 16GB (Wit) [FW: 4.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 19 December 2007
Locatie: Vlaardingen
Berichten: 87
Standaard

ik zou de array pas aanmaken als de een instantie maakt van je eigen XMLParser.
  #11  
Oud 17 June 2009, 22:26
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Citaat:
Oorspronkelijk geplaatst door danielpunt Bekijk bericht
ik zou de array pas aanmaken als de een instantie maakt van je eigen XMLParser.
Het hele idee is juist dat je die array een variabele in je eigen XML parser klasse is... Dan word ie dus automatisch aangemaakt als je 'm instantieerd.
  #12  
Oud 18 June 2009, 12:58
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

Citaat:
Het hele parsen en opbouwen van de array doe je dus in je eigen klasse. Als je dan een method maakt van parsedArray of zoiets dan kan je die opgebouwde array opvragen.
Dit was ook mijn idee maar het lukt nog niet ,ik wilde ook dus een methode parsedArray maak en deze weer netjes kan uitlezen in de klasse waar ik hem nodig heb.
Vergeef me mijn rookievraag (en kennis) dus maar hoe kan ik dit dan realiseren. Ik dacht namelijk nadat ik hem heb geinitialiseerd en gebruik in een andere functie (foundCharacters in mijn geval) ik het vrolijk in bv. parsedArray zou kunnen gebruiken
zoiets
Code:
-(NSMutable *)parsedArray
{
return myParsedArray;
}
Citaat:
Je roept je parser aan en daarna is je array gevuld. Vaak doe je dat soort initiele dingen in je applicationDidFinishLaunching functie.
Dit doe ik, in mijn applicationDidFinishLaunching functie initialiseer ik de url , mijn NSXMLParser en mijn delegate.
Code:
NSURL *url = [[ etcetera .....
NSXMLParser *xmlParser = [[NSXMLParser alloc] etcetera....

//initialiseer de delegate
XMLParser *parser = [[XMLParser alloc] initXMLParser];

// set delegate 
[xmlParser setDelegate:parser];
In mijn parser heb ik dus 4 methoden ( en dat moeten er 5 worden voor mijn functie die de array zal afhandelen )
-(XMLParser *)initXMLParser
- (void)parser ( NSXMLParser *)parser didStartElement
- (void)parser( NSXMLParser *)parser foundCharacters
-(void)parser( NSXMLParser *)parser didEndElement
-(NSMutable *)giveArray

@danielpunt Ik initiliaseer de array pas in mijn XMLParser klasse.

  #13  
Oud 18 June 2009, 13:51
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Als je nou in de init method van je XMLParser klasse een NSXMLParser object creeert en ook in die klasse zelf houd, dus niet ernaast zoals je nu hebt ben je er. Daarnaast creeer je in je in de init method van de XMLParser klasse ook het array wat je gaat vullen. Daarna roep je de parse method aan, die weer de parse method van NSXMLParser aanroept en vul je de array.

Dan heb je method die de gevulde array teruggeeft.

Oftewel: maak je XMLParser klasse zo dat ie alles doet wat ie moet doen en de daarvoor benodigde klassen zelf in "beheer" heeft (zoals NSXMLParser).

In code:
Code:
@implementation XMLParser

- (id)initWithURL(NSString *)aURL
{
  NSURL *url = [[NSURL alloc] initWithString:aURL];
  NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
  [xmlParser setDelegate:self];

  NSMutableArray *dataArray = [[NSMutableArray alloc] init];

  return self;
}

- (BOOL)parse
{
  return [xmlParser parse];
}

- (NSMutableArray *)parsedDataArray
{
  return dataArray;
}

-(void)parser ( NSXMLParser *)parser didStartElement {...}
-(void)parser( NSXMLParser *)parser foundCharacters {...}
-(void)parser( NSXMLParser *)parser didEndElement {...}

Laatst gewijzigd door Myrdhin; 18 June 2009 om 13:54.
  #14  
Oud 18 June 2009, 17:48
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

aha.. ok super, ik snap wat je wilt doen
zelf heb ik dit gedaan
Code:
@implementation XMLParser

-(id) initXMLparser
{
NSURL *url = [[NSURL alloc] initWithString:@"http://www.mijnsite.com/super.xml"];
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[xmlParser setDelegate:self];

testarray = [[NSMutableArray alloc] init];
return self;
}

-(BOOL)parsing
{
return [xmlParser parse];
}

-(NSMutableArray *)GetArray
{
return testarray;
}

etc.
Uiteraard
onderaan staan mijn
parser startElement
parser foundCharacters
parser EndElement


vervolgens in de applicationDidFinishLaunching

Code:
momenteel
XMLParser *parser = [[XMLParser alloc] initXMLParser];

BOOL success = [parser parse];
if(success)
NSLog("no error");
else 
 NSLog("error");


eerste version 
//de code van de huidige initXMLParser
 
xmlParser setDelegate:parser 
BOOL succes = [xmlParser parse] 
if(success)
NSLog("no error");
else 
NSLog("error");
Als ik het goed heb zou dus parse toch in applicationDidFinishLaunching moeten worden aangeroepen ( maar kan het helemaal fout hebben ).

Ik krijg nu ook sowieso waarschuwing bij parser ( dat XMLParser maybe niet reageert op parse ) en wanneer ik het run een foutmelding ( selector herkent het niet [XMLParser parse]

In mijn redenatie zie ik wat je bedoelt , heb je ook top uitgelegd , heb het alleen nog niet kunnen realiseren in mijn code.

Again vergeef me mijn onkunde.
ps. Ik heb de parser van deze uitleg in mijn programma gebruikt
Parsing XML Files - iPhone SDK Articles
  #15  
Oud 19 June 2009, 02:48
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Je definieert in je XMLParser klasse de method "parsing", maar je roept "parse" aan, logisch dat ie die niet vind.
  #16  
Oud 23 June 2009, 11:53
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

sorry dat ik zo laat reageer ,maar ten eerste

pffff wat een slaapkop was ik natuurlijk! .. ( parsing en parse )

tweede ik wil je sowieso echt super bedanken echt top en topadviezen!

De code is nu zoals het moet zijn.
Echter krijg ik niet het resultaat dat ik wens. Heb alleen het gevoel dat de oorzaak ergens anders ligt.
Zoals ik al eerder zei wil ik graag vanuit een array verschillende strings halen om de tekst op mijn buttons (of labels ) te krijgen.
Op de een of andere manier lijkt het of de arrays alleen maar werken met de benodigde inhoud als ik er initWithObjects of zoiets dergelijks van maak.

Ik ga er nog even goed voor zitten! Ik kom er nog op terug.
  #17  
Oud 23 June 2009, 13:17
» iPhone 6 64GB (Space Grijs) [FW: 8.0]  [Jailbreak: Nee]
» iPad 4 Wi-Fi 32GB (Zwart) [FW: 8.0]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 12 March 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

Arrays zijn alleen maar lijsten van objecten. Een NSString is een object. Daarnaast zijn er 2 typen arrays: Mutable en niet mutable. Als je na het aanmaken van een array nog dingen wilt toevoegen moet het dus een NSMutableArray zijn i.p.v. NSArray.
  #18  
Oud 23 June 2009, 14:35
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

ok, ik gebruik ook alleen NSMutableArray.
Als ik een NSLog ertussen plaats kan ik zien dat hij mijn array ook netjes vult. Ook kan ik zien in mijn debugger console dat eerst mijn parser wordt gestart voor hij naar het mainscherm gaat.
Ik zou dus zelf denken dat ik de objecten uit deze array ( strings in dit geval ) gewoon kan gebruiken om bv. mijn button of label dus van tekst te voorzien.
Helaas geeft het dus een een lege bedoeling.

Het lijkt dus echt alsof hij automatisch de lege array initialiseert. En ondanks dat ik het vul , het gewoon weigert er iets mee te doen. Misschien ligt het wel aan de volgorde waarin ik bepaalde objecten initialiseer maar kan me eerlijk gezegd nauwelijks voorstellen.

Het volgende gebeurt( of moet gebeuren ).

1) Parser laadt xml bestand loopt er doorheen vult array met string objecten.

2) mainscreen wordt geladen. En buttons en eventueel labels halen strings uit de NSMutable array.( momenteel heb ik deze actie achter een buttonklik geplaatst maar dat moet voordat het scherm wordt geladen gedaan worden).

3) vanuit mainscreen kun je naar een tweede scherm die ook buttons/labels heeft en ook deze zal z'n teksten halen uit de array.

gedeelte 1 doet het dus , maar gedeelte 2 en 3 uiteraard dus niet.

Zoals ik zei ik denk dat er iets mis gaat in de volgorde dus ik ga nog een aantal zaken op een rij zetten en wat testjes uitvoeren. Mocht ik eruit komen post ik uiteraard wat er mis ging
  #19  
Oud 1 July 2009, 13:48
danielpunt's schermafbeelding
» iPhone 3G 16GB (Wit) [FW: 4.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 19 December 2007
Locatie: Vlaardingen
Berichten: 87
Standaard

als je het MVC pattern gebruikt is het beter om bijvoorbeeld een initWithButtons: method toe te voegen aan de tweede viewController die je presenteerd en die array mee te geven op het moment dat je het tweede scherm wilt weergeven.

dat is dus voor punt 3

voor punt 2 moet je dus als de XML geladen en geparsed is door de array lopen en dan de buttons aanmaken en vullen.
  #20  
Oud 6 July 2009, 21:33
» Ik heb geen iPhone  
» Windows
 
Geregistreerd: 27 April 2009
Berichten: 40
Standaard

Had even een kleine vakantie maar ben er weer.
Ben weer druk bezig met mijn "probleempje".
pfffff man o man het moet echt simpel zijn denk ik bij mezelf maarja.
Ik wil bijna mijn code meenemen naar een objective c leraar verdorie zeg maarja, lol.

Anyway initWithButtons :Method , ik neem aan dat je die dus ergens in de ApplicationDidFinishLaunching methode in de delegate wilt doen right?

Ff kleine samenvatting
http://www.iphonesdkarticles.com/200...xml-files.html

zij doen in principe hetgeen wat ik wil alleen dan heb ik dus mijn eigen nib file ontworpen die dus titels krijgt vanuit de xml file ... bij de foundcharacters heb ik dus een array geplaatst en hieruit wil ik dus mijn outlets aan gaan passen. ( ik zie echter dat zij een andere manier hanteren maar gezien mijn onervarenheid pak ik het zo dus aan )

Laatst gewijzigd door ulquiorra; 7 July 2009 om 00:08.
Reageren


Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten)

 
Discussietools
Weergave

Soortgelijke discussies

Discussie Auteur Forum Reacties Laatste bericht
Archiveren van UIImageView's rechtstreeks uit array zonder [self.view subviews] celaeno2 Ontwikkelen voor iOS 1 24 November 2010 02:14
e-mailen vanuit andere app's gaat via Outbox (en niet rechtstreeks) ToastNL iPhone Apps 0 4 September 2010 22:19
Array met dicts naar een plist schrijven MaximalFX Ontwikkelen voor iOS 0 18 November 2009 10:49
NSString bepalen vanuit een andere view Jelle Ages Ontwikkelen voor iOS 11 24 October 2009 18:57
UILabel updaten vanuit andere class Niels2678 Ontwikkelen voor iOS 18 5 October 2009 12:42

Regels voor berichten
Je mag geen nieuwe discussies starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit
Trackbacks are Aan
Pingbacks are Aan
Refbacks are Uit



Alle tijden zijn GMT +2. Het is nu 17:56.