Buttons aus ScrollView zur Laufzeit entfernen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Buttons aus ScrollView zur Laufzeit entfernen

    Hallo,

    ich habe in meinem Programm eine horizontal verlaufende Scrollview, in die schrittweise neue UIButtons eingefügt werden.
    Genauer gesagt, werden immer 2 Buttons übereinander eingefügt und mit einer Action verlinkt.

    In der Action wird dann (über ein ActionSheet) geklärt, ob eine Aktivität gestartet oder der soeben aufgerufene Eintrag entfernt werden soll.
    Beim Löschen müssen natürlich beide Buttons wieder weg und die Lücke muss geschlossen werden. Daher dachte ich, am einfachsten wäre ein komplettes Neuerstellen aller Buttons.
    Dazu aber muss ich die Scrollview zunächst leeren und da ist das Problem:
    Nach dem Leeren der View und Erstellen der verbleibenden Buttons kommt der Absturz mit der Meldung:

    -[NSCFString release]: message sent to deallocated instance 0x4b7cac0



    Dummerweise ist dies nach Abarbeitung der Action und ich komme beim Debuggen dort nicht mehr hin.

    Wahrscheinlich mache ich Blödsinn beim Leeren oder beim Einfügen.
    Hier ist der Code für das Leeren der View

    Quellcode

    1. -(void)emptyGallery {
    2. for (UIView *myView in [vController.viewGallery subviews]) {
    3. if ([myView isKindOfClass:[UIButton class]]) {
    4. NSLog(@"Entferne SubView");
    5. [myView release];
    6. }
    7. }
    8. }



    Hier werden die Buttons erzeugt:

    Quellcode

    1. -(void)makeGalleryButtonWithGalleryRec:(GalleryRec *)gallRec LeftPos:(int)leftPos buttonWidth:(int)buttonWidth isUpperButton:(BOOL)isUpper {
    2. UIButton *newButton = [UIButton buttonWithType:UIButtonTypeCustom];
    3. int oben = (isUpper) ? 8 : 26;
    4. NSString *titel = (isUpper) ? [XmlData getGalleryTitel:gallRec.typID] : [NSString stringWithString:gallRec.titel];
    5. newButton.frame = CGRectMake(leftPos, oben, buttonWidth, 19);
    6. [newButton setTag:gallRec.dbIndex];
    7. [newButton setTitle:titel forState:UIControlStateNormal];
    8. newButton.autoresizesSubviews = YES;
    9. newButton.titleLabel.adjustsFontSizeToFitWidth = YES;
    10. [newButton setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
    11. [newButton addTarget:vController action:@selector(clickedGalleryButton:forEvent:) forControlEvents:UIControlEventTouchUpInside];
    12. [vController.viewGallery addSubview:newButton];
    13. }
    14. -(void)fillGallery {
    15. [self emptyGallery];
    16. Gallery *myGallery = [Gallery sharedInstance];
    17. int leftPos = 120, breite = 120;
    18. for (GalleryRec *gRec in myGallery.galleryArray) {
    19. [self makeGalleryButtonWithGalleryRec:gRec LeftPos:leftPos buttonWidth:breite isUpperButton:YES];
    20. [self makeGalleryButtonWithGalleryRec:gRec LeftPos:leftPos buttonWidth:breite isUpperButton:NO];
    21. leftPos += (breite + 10);
    22. }
    23. [vController.viewGallery setContentSize:CGSizeMake(leftPos + 80, vController.viewGallery.frame.size.height)];
    24. [vController.viewGallery setShowsHorizontalScrollIndicator:YES];
    25. [vController.viewGallery setDirectionalLockEnabled:NO];
    26. [vController.viewGallery scrollRectToVisible:CGRectMake(leftPos, 1, leftPos+ 10, 20) animated:[[BIS_Common sharedInstance] shouldAnimate]];
    27. }
    Alles anzeigen



    Kann *bitte* jemand den Finger auf den Fehler halten ?
  • Wie wäre es wenn Du das View erstmal entfernst anstatt zu releasen? Dafür gibt es so Funktionen wie RemoveFromSuperView ..

    Wiso released du ein View dessen Owner du gar nicht mehr bist?

    Gruß

    CLaus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Wie wäre es wenn Du das View erstmal entfernst anstatt zu releasen? Dafür gibt es so Funktionen wie RemoveFromSuperView ..

    Wiso released du ein View dessen Owner du gar nicht mehr bist?
    Das hatte ich vorher auch probiert:

    Quellcode

    1. -(void)emptyGallery {
    2. for (UIView *myView in [vController.viewGallery subviews]) {
    3. if ([myView isKindOfClass:[UIButton class]]) {
    4. NSLog(@"Entferne SubView");
    5. [myView removeFromSuperview];
    6. }
    7. }
    8. }



    Läuft aber auf denselben Fehler hinaus.

    Falls es etwas zu bedeuten hat:
    Beim Löschen eines Eintrages wird der ViewController mit einer Notification aufgefordert, die ScrollView zu leeren und neu zu füllen.
    Der Aufruf dazu steht hier:

    Quellcode

    1. -(void)eventHandler:(NSNotification *)notification {
    2. FillViews *fillView = [FillViews FillViewWithView:self xmlData:[[BIS_Common sharedInstance] lastXmlData]];
    3. [fillView fillGallery];
    4. [viewGallery setNeedsLayout];
    5. DLog(@"Galleryitem wurde entfernt");
    6. }



    Das setNeedsLayout habe ich gerade ausprobiert, ändert aber auch nichts.
    Das Letzte, was im Log steht, ist der Eintrag aus dem eventHandler, dann kommt der Fehler.