【问题标题】:Updating a ScrollView's Content更新 ScrollView 的内容
【发布时间】:2011-01-23 23:09:45
【问题描述】:

我有一个应用程序,其中包含一个带有多个表格视图的滚动视图。每个表视图都是从另一个视图控制器加载的。它是从 Apple 的 PageControl 示例应用程序构建的。我的目标是让它像 Apple 的天气应用一样工作。

我一切正常。所有内容都完美加载,左右滚动显示所有正确的表格视图及其相关数据。我有一个按钮,点击它会打开另一个视图,允许您编辑每个item,就像天气应用程序一样,您可以在其中添加、删除或移动它。 p>

我遇到的问题是当用户编辑完 items 后如何更新滚动视图。想象一下,在 PageControl 应用程序中能够删除第 5 页或将第 4 页移动到位置 #1,等等。

我没有粘贴任何代码,因为:1)它与 PageControl 应用程序中的代码相同; 2)我还没想好从哪里开始。希望这里有人可以帮助我。

谢谢。

更新:(2010 年 3 月 5 日凌晨 3:18 EST)

好的,所以我已经研究了一段时间。我能够在 mainView 中调用一个方法来更新他的滚动视图。代码看起来有点笨拙,但它确实有效!我真的不喜欢该代码,因为我最终使用了一次属性,并且无法再次设置它,因为我收到错误objc[10801]: FREED(id): message release sent to freed object=0x3f4a490。在我看来,该对象似乎已被释放?如果是这样,我不知道如何,因为我只在dealloc 中发布它。 dealloc 从来没有被调用过(我放了一个NSLog 来检查)所以我不知道发生了什么。

代码:初始代码与 Apple 的 PageControl 示例应用程序中的代码相同:

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

然后我有我的代码来刷新滚动视图。我所做的是删除所有子视图并再次加载它们。我永远不会有超过 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 方法是从子视图中调用的,其中可以添加或删除 items 以显示在滚动视图上。

【问题讨论】:

  • 希望有人能解答上述问题。
  • 我知道已经有一段时间了。仍然有这个问题......希望有人可以提供帮助。谢谢!

标签: iphone scrollview uipagecontrol


【解决方案1】:

(我遇到了同样的问题,我想将UIImageView's 添加到我的 mainView 并像那样更新它们)我只是使用了一个 NSMutable 数组,其中包含要在视图中显示的 ViewController,然后添加或减去根据需要从中添加或减去该数组,然后从 mainView 内部调用一个方法,该方法通过 scrollView 并从 scrollView 中删除每个视图,然后将适当的 viewController 添加到 scrollView。希望这会有所帮助。

【讨论】:

  • 这实际上是我想要完成的,但我似乎无法找到如何引用包含滚动视图的根控制器以及将视图加载到滚动视图中的所有代码。我正在使用一个导航视图控制器,这个代码在 appdelegate 中。创建新导航应用时的基本代码。 - (void)applicationDidFinishLaunching:(UIApplication *)application { [window addSubview:[navigationController view]]; [窗口 makeKeyAndVisible]; (不知道如何在注释框中格式化代码)有没有办法通过navigationController引用rootviewcontroller?
  • 更好的是,我不能只调用 parentcontroller 吗? (DUH)然后调用该父级的控制器方法进行刷新?我现在就试试……
  • 这就是我想要表达的意思,我可能还不够清楚。
  • 当我们谈到它时,我已经完成了这件事,但我现在遇到了另一个问题。我继续编写代码,将新的 viewController 添加到 NSMutableArray,然后从 scrollView 中删除所有内容,然后再次在 NSMutableArray 中添加视图。问题是这需要一段时间才能发生。大约 2-3 秒,大约 4-5 次观看。全部 13 次观看时更长。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 2022-10-18
相关资源
最近更新 更多