Frage

Ich habe eine App, die eine Scrollview mit mehreren Tabellenansichten enthält. Jede Tabellenansicht wird von einem anderen ViewController geladen. Es wird aus der PageControl -Beispiel -App von Apple erstellt. Mein Ziel ist es, dass es genau wie Apples Wetter -App funktioniert.

Ich habe alles gut funktioniert. Alle Inhalte laden perfekt und scrolls von Seite an Seite werden alle richtigen Tabellenansichten und deren relativen Daten angezeigt. Ich habe eine Schaltfläche, die beim Klicken eine andere Ansicht öffnet, mit der Sie jeden bearbeiten können Artikel, Genau wie die Wetter -App, in der Sie eine neue Stadt hinzufügen, sie löschen oder bewegen können.

Das Problem, das ich habe, ist, wie ich die Scrollview aktualisiere, wenn der Benutzer fertig ist, um die zu bearbeiten Artikel. Stellen Sie sich vor, in der PageControl -App können Sie Seite 5 oder Seite 4 in Position 1 usw. entfernen.

Ich habe keinen Code eingefügt, weil: 1) der gleiche Code in der PageControl -App ist. 2) Ich habe nicht herausgefunden, wo ich anfangen soll. Hoffentlich kann mir jemand hier helfen.

Vielen Dank.

Update: (05.03.2010 3:18 Uhr EST)

Ok, also habe ich eine Weile daran gearbeitet. Ich konnte eine Methode im Mainview aufrufen, um den Scrollview zu aktualisieren. Der Code scheint ein bisschen klobig, aber er funktioniert! Ich mag den Code wirklich nicht, weil ich eine Eigenschaft einmal benutze und ihn nicht wieder einstellen kann, weil ich einen Fehler bekomme objc[10801]: FREED(id): message release sent to freed object=0x3f4a490. Für mich scheint es, als wäre das Objekt veröffentlicht worden? Wenn ja, weiß ich nicht wie, da ich es nur in der veröffentliche dealloc. dealloc wird nie angerufen (ich habe eine gesetzt NSLog um zu überprüfen) also weiß ich nicht, was los ist.

Code: Der anfängliche Code ist der gleiche Code von PageControl -Beispiel -App von Apple:

- (void)viewDidLoad {
    [super viewDidLoad];
    appDel = (iBarryAppDelegate *)[[UIApplication sharedApplication] delegate];
    managedObjectContext = appDel.managedObjectContext;
    NSMutableArray *controllers = [[NSMutableArray alloc] init];
    for (unsigned i = 0; i < numberOfPages; i++)
    {
        [controllers addObject:[NSNull null]];
    }
    self.viewControllers = controllers;
    [controllers release];
    scrollView.pagingEnabled = YES;
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * numberOfPages, scrollView.frame.size.height);
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.scrollsToTop = NO;
    scrollView.delegate = self;
    pageControl.numberOfPages = numberOfPages;
    pageControl.currentPage = 0;
    //I end up commenting out all the method calls to
    //[self loadScrollViewWithPage:xxx]; and load all the views at once.
    //I know I should be lazy-loading here , but Scrolling is much 
    //faster if I load them all at once, instead 
    //of when they are about to be viewed.
    for (unsigned i = 0; i < numberOfPages; i++)
    {
        [self loadScrollViewWithPage:i];
    }
}
- (void)loadMainController:(int)page
{
    MainViewController *controller = [viewControllers objectAtIndex:page];
    if ((NSNull *)controller == [NSNull null])
    {
        controller = [[MainViewController alloc] initWithPageNumber:page];
        [viewControllers replaceObjectAtIndex:page withObject:controller];
        [controller release];
    }
    if (nil == controller.view.superview)
    {
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;
        controller.view.frame = frame;
        [scrollView addSubview:controller.view];
    }
}
- (void)loadScrollViewWithPage:(int)page
{
    if (page < 0) return;
    if (page >= numberOfPages) return;
    [self loadMainController:page];
}
- (void)scrollViewDidScroll:(UIScrollView *)sender
{
    if (pageControlUsed)
    {
        return;
    }
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    pageControl.currentPage = page;
//  [self loadScrollViewWithPage:page - 1];
//  [self loadScrollViewWithPage:page];
//  [self loadScrollViewWithPage:page + 1];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    pageControlUsed = NO;
}
- (IBAction)changePage:(id)sender
{
    int page = pageControl.currentPage;
//  [self loadScrollViewWithPage:page - 1];
//  [self loadScrollViewWithPage:page];
//  [self loadScrollViewWithPage:page + 1];
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    [scrollView scrollRectToVisible:frame animated:YES];
    pageControlUsed = YES;
}

Ich habe dann meinen Code zu Aktualisierung Die Scrollview. Was ich tue, ist alle Unteransicht zu entfernen und sie erneut zu laden. Ich werde nie mehr als 13 Subviews haben, nicht sicher, ob das Löschen von allen und die Neueinstellung eine gute oder schlechte Idee ist.

- (void)reloadDataNow
{
    for(UIView *subview in [scrollView subviews]) {
            [subview removeFromSuperview];
            NSLog(@"removed a suview");
    }
    [self loadData]; //this method fetches which data will be 
    //in the scrollView. It reloads the number of pages based 
    //on the return result and an NSMutableArray where I store 
    //data to pass to the views that will appear in the scrollView
    NSMutableArray *controllers = [[NSMutableArray alloc] init];
    for (unsigned i = 0; i < numberOfPages; i++)
    {
        [controllers addObject:[NSNull null]];
    }
    scrollView.pagingEnabled = YES;
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * numberOfPages, scrollView.frame.size.height);
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.scrollsToTop = NO;
    scrollView.delegate = self;
    pageControl.numberOfPages = numberOfPages;
    pageControl.currentPage = 0;
    for (unsigned i = 0; i < numberOfPages; i++)
    {
        MainViewController *controller = [controllers objectAtIndex:i];
        if ((NSNull *)controller == [NSNull null])
        {
            controller = [[MainViewController alloc] initWithPageNumber:i team:[[favoritesArray objectAtIndex:i] teamR]];
            [controllers replaceObjectAtIndex:i withObject:controller];
            [controller release];
        }
        if (nil == controller.view.superview)
        {
            CGRect frame = scrollView.frame;
            frame.origin.x = frame.size.width * i;
            frame.origin.y = 0;
            controller.view.frame = frame;
            [scrollView addSubview:controller.view];
        }
    }
    //********************CRASH******************
    //Ideally, I think, the line below would replace the contents of
    //viewControllers with the new controllers. Here is where I get the 
    //"objc[10801]: FREED(id): message release sent to freed object=0x3f4a490" 
    //error. This line should probably be placed after [self loadData] or something,
    //but it crashes so I put but here to display better. I tried
    //adding self.viewControllers = nil; but I don't think that is 
    //the problem with the error message.
    self.viewControllers = controllers;
}

Das reloadDataNow Die Methode wird aus einer untergeordneten Ansicht aufgerufen, in der man hinzufügen oder entfernen kann Artikel auf der Scrollview anzeigen.

War es hilfreich?

Lösung

(Ich hatte das gleiche Problem, ich wollte hinzufügen UIImageViewIch habe gerade ein unmachtbares Array der ViewController verwendet, die Sie in der Ansicht anzeigen möchten. Ein Metod aus Ihrem Mainview, der die Bildlaufansicht durchläuft und jede Ansicht aus der ScrollView entfernt und dann den entsprechenden ViewController zum Scrollview hinzugefügt wird. Hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top