9 berichten aan het bekijken - 1 tot 9 (van in totaal 9)
  • Q:
    Bijdrager
    Daan

    Object in Array werkt niet maar object los wel

    Deze code werkt niet:

    <br />
    -(void)checkSelected:(NSString *)theObject {<br />
        OpstellingViewController *opstelling = [[OpstellingViewController alloc] init];<br />
        NSArray *pathsforWriteToPlist = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />
        NSString *documentsDirectory = [pathsforWriteToPlist objectAtIndex:0];<br />
        NSURL *urlToSavePlist1 = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingString:@"/DataList3.plist"]];<br />
        NSURL *urlToSavePlist2 = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingString:@"/DataList4.plist"]];<br />
        NSURL *urlToSavePlist3 = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingString:@"/DataList5.plist"]];<br />
        NSLog(@"Read Plist");<br />
        opstelling.verdedigingNaamArray = [[NSMutableArray alloc] initWithContentsOfURL:urlToSavePlist1];<br />
        opstelling.middenveldNaamArray = [[NSMutableArray alloc] initWithContentsOfURL:urlToSavePlist2];<br />
        opstelling.aanvalNaamArray = [[NSMutableArray alloc] initWithContentsOfURL:urlToSavePlist3];<br />
        NSLog(@"Set Plist");</p>
    <p>    NSUInteger integerforObject = [array indexOfObject:theObject];</p>
    <p>        if ([opstelling.verdedigingNaamArray containsObject:theObject]) {<br />
                theObject = @"Selected";<br />
                NSLog(@"Verdediging: %@", theObject);<br />
            }</p>
    <p>        if ([opstelling.middenveldNaamArray containsObject:theObject]) {<br />
                theObject = @"Selected";<br />
                NSLog(@"Middenveld: %@", theObject);<br />
            }<br />
            if ([opstelling.aanvalNaamArray containsObject:theObject]) {<br />
                theObject = @"Selected";<br />
                NSLog(@"Aanval: %@", theObject);<br />
            }<br />
            if (!([theObject isEqualToString:@"Selected"])) {<br />
                theObject = @"Not Selected";<br />
                NSLog(@"Not Selected: %@", theObject);<br />
            }<br />
        [array removeObjectAtIndex:integerforObject];<br />
        [array insertObject:theObject atIndex:integerforObject];</p>
    <p>}-(IBAction)checkSelectedIB {<br />
        for (id ObjectArray in array)<br />
            [self checkSelected:ObjectArray];<br />
    }<br />
     

    Maar deze code wel:

    <br />
    -(void)checkSelected:(NSString *)theObject {<br />
        OpstellingViewController *opstelling = [[OpstellingViewController alloc] init];<br />
        NSArray *pathsforWriteToPlist = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />
        NSString *documentsDirectory = [pathsforWriteToPlist objectAtIndex:0];<br />
        NSURL *urlToSavePlist1 = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingString:@"/DataList3.plist"]];<br />
        NSURL *urlToSavePlist2 = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingString:@"/DataList4.plist"]];<br />
        NSURL *urlToSavePlist3 = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingString:@"/DataList5.plist"]];<br />
        NSLog(@"Read Plist");<br />
        opstelling.verdedigingNaamArray = [[NSMutableArray alloc] initWithContentsOfURL:urlToSavePlist1];<br />
        opstelling.middenveldNaamArray = [[NSMutableArray alloc] initWithContentsOfURL:urlToSavePlist2];<br />
        opstelling.aanvalNaamArray = [[NSMutableArray alloc] initWithContentsOfURL:urlToSavePlist3];<br />
        NSLog(@"Set Plist");</p>
    <p>    NSUInteger integerforObject = [array indexOfObject:theObject];</p>
    <p>        if ([opstelling.verdedigingNaamArray containsObject:theObject]) {<br />
                theObject = @"Selected";<br />
                NSLog(@"Verdediging: %@", theObject);<br />
            }</p>
    <p>        if ([opstelling.middenveldNaamArray containsObject:theObject]) {<br />
                theObject = @"Selected";<br />
                NSLog(@"Middenveld: %@", theObject);<br />
            }<br />
            if ([opstelling.aanvalNaamArray containsObject:theObject]) {<br />
                theObject = @"Selected";<br />
                NSLog(@"Aanval: %@", theObject);<br />
            }<br />
            if (!([theObject isEqualToString:@"Selected"])) {<br />
                theObject = @"Not Selected";<br />
                NSLog(@"Not Selected: %@", theObject);<br />
            }<br />
        [array removeObjectAtIndex:integerforObject];<br />
        [array insertObject:theObject atIndex:integerforObject];</p>
    <p>}-(IBAction)checkSelectedIB {<br />
        NSString *ObjectArray = [array objectAtIndex:1];<br />
            [self checkSelected:ObjectArray];<br />
    }<br />
     

    Zo als jullie al snappen wil ik graag dat hij dit doet voor elk Object in de Array maar dat werkt niet. Weet iemand hoe ik dit kan oplossen.

    Alvast bedankt.

    Bijdrager
    Verwijder

    “werkt niet” is erg vaag, wat gaat er mis, wat zijn de verschijnselen?

    Er valt nog veel meer te verbeteren maar een probleem is denk ik dat je een array niet mag wijzigen terwijl je het met for afloopt. Je zou for niet kunnen gebruiken of een ander array met strings kunnen vullen.

    Bijdrager
    Daan

    De applicatie terminate. Zou je me kunnen uit leggen hoe ik het beter kan doen

    Bijdrager
    Verwijder

    “De applicatie terminate.” zegt ook niet zo veel. De applicatie stopt er niet zomaar mee, er wordt waarschijnlijk iets op de console vermeld.

    Als je wilt leren programmeren zal je ook basiskennis moeten opdoen en moeten leren debuggen. In de documentatie spitten ontkom je ook niet aan. Ik weet niet waar/hoe je hebt leren programmeren maar neem de hoofdstukken over arrays, viewcontrollers, paths en debuggen nog een keer door.

    Bijdrager
    Daan
    <br />
    *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFArray: 0x6a4ab90> was mutated while being enumerated.'<br />
    *** First throw call stack:<br />
    (0x13d7052 0x1568d0a 0x13d6c21 0x11279 0x13d8ec9 0x315c2 0x3155a 0xd6b76 0xd703f 0xd62fe 0x56a30 0x56c56 0x3d384 0x30aa9 0x12c1fa9 0x13ab1c5 0x1310022 0x130e90a 0x130ddb4 0x130dccb 0x12c0879 0x12c093e 0x2ea9b 0x2008 0x1f65)<br />
    terminate called throwing an exceptionsharedlibrary apply-load-rules all<br />
    (gdb)<br />
     
    Bijdrager
    Daan

    Daar dit is wat er volledig in mijn Log staat

    <br />
    2011-10-23 11:28:13.318 HockeyCoachiPhone[50956:f803] Read Plist<br />
    2011-10-23 11:28:13.319 HockeyCoachiPhone[50956:f803] Set Plist<br />
    2011-10-23 11:28:13.319 HockeyCoachiPhone[50956:f803] Verdediging: Selected<br />
    2011-10-23 11:28:13.320 HockeyCoachiPhone[50956:f803] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFArray: 0x6a4ab90> was mutated while being enumerated.'<br />
    *** First throw call stack:<br />
    (0x13d7052 0x1568d0a 0x13d6c21 0x11279 0x13d8ec9 0x315c2 0x3155a 0xd6b76 0xd703f 0xd62fe 0x56a30 0x56c56 0x3d384 0x30aa9 0x12c1fa9 0x13ab1c5 0x1310022 0x130e90a 0x130ddb4 0x130dccb 0x12c0879 0x12c093e 0x2ea9b 0x2008 0x1f65)<br />
    terminate called throwing an exceptionsharedlibrary apply-load-rules all<br />
    (gdb)<br />
     
    Bijdrager
    bitsflew

    De fout wordt veroorzaakt door de volgende regel:

    [array removeObjectAtIndex:integerforObject];

    Binnen een fast enumeration loop (checkSelectedIB) mag je geen objecten toevoegen/verwijderen aan het object (‘array’ in dit geval) waarover je itereert.

    Vandaar ook de foutmelding:

    <br />
    Collection <__NSCFArray: 0x6a4ab90> was mutated while being enumerated<br />
     

    Mogelijke oplossing:

    <br />
    -(IBAction)checkSelectedIB {<br />
        for (id ObjectArray in [[array copy] autorelease])<br />
            [self checkSelected:ObjectArray];<br />
    }<br />
     

    edit: autorelease vergeten in checkSelectedIB

    Bijdrager
    Daan

    Heel erg bedankt! Werkt!

    Bijdrager
    Nando Bennis

    De fout komt door [array removeObjectAtIndex:integerforObject];

9 berichten aan het bekijken - 1 tot 9 (van in totaal 9)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.