Вопрос

У меня есть приложение, которое содержит ScrollView с несколькими табличками. Каждое таблица загружается из другого ViewController. Он построен из приложения PageControl от Apple. Моя цель состоит в том, чтобы она работала точно так же, как приложение погоды Apple.

У меня все работает просто хорошо. Все контент нагрузки идеально и прокрутка сторона в сторону отображает все правильные таблицы и их относительные данные. У меня есть кнопка, которая при щелчке он открывает другой вид, который позволяет редактировать каждый пункт, Как и приложение погоды, где вы можете добавить новый город, удалить его или переместить его вокруг.

Проблема, которую я имею в том, как мне обновить ScrollView, когда пользователь сделан редактирование Предметы. Отказ Представьте себе, что в приложении PageControl может удалить страницу 5 или переместить страницу 4 в положение № 1 и т. Д.

Я не вставил какой-либо код, потому что: 1) Это тот же код в приложении PageControl; 2) Я не разобрался с то, где начать. Надеюсь, кто-то здесь может помочь мне.

Спасибо.

Обновление: (3/5/2010 3:18 ast est)

Хорошо, так что я работаю над этим некоторое время. Я смог вызвать метод в MainView для обновления HE ScrollView. Кодекс кажется вроде Clunky, но это работает! Мне действительно не нравится код, потому что я в конечном итоге использую свойство один раз, и я не могу установить его снова, потому что я получаю ошибку objc[10801]: FREED(id): message release sent to freed object=0x3f4a490. Отказ Мне кажется, что объект был освобожден? Если это так, я не знаю, как, как я только отпускаю его в dealloc. dealloc никогда не вызывается (я положил NSLog Чтобы проверить) Так что я не знаю, что происходит.

Код: Начальный код - это тот же код из приложения PageControl пример от 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;
}

У меня тогда мой код освежать ScrollView. То, что я делаю, это удалить все подвыраживания и загрузить их снова. У меня никогда не будет больше 13 подзреждений, не уверена, если удалять их все и воссоздание их хорошая или плохая идея.

- (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;
}

То reloadDataNow Метод вызывается из дочернего представления, где можно добавить или удалить Предметы Чтобы показать на ScrollView.

Это было полезно?

Решение

(У меня была такая же проблема, я хотел добавить UIImageViewДля моего MainView и обновить их так), я только что использовал NSmutable массив ViewControllers, которые вы хотите отобразить в представлении, а затем добавить или вычесть из этого по мере необходимости, и каждый раз, когда вы добавляете или вычитаете из этого массива, а затем вызовите Metod изнутри вашего Mainview, который проходит через ScrollView и удаляет каждый вид из ScrollView, а затем добавляет соответствующий ViewController в ScrollView. Надеюсь это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top