0

我正在开发 iPad 电子书类型的应用程序。我必须从 Web 服务获取数据并在应用程序启动时将其显示在 webView 中。因此,在应用程序开始时,我正在使用 UIWebview 创建一个 UIViewController 数组。当我开始在 38-42 页从一个页面遍历到另一个页面时,它会收到内存警告并仅在 iPad3 中崩溃,但在 iPad2 中工作正常。

下面是代码。


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
 pageContent = [[NSMutableArray alloc] init];
 for (int i=0;i<60; i++)
 {
[self addwebviewINCode]; } NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin] forKey: UIPageViewControllerOptionSpineLocationKey]; self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options: options]; pageController.dataSource = self; pageController.delegate=self; [[pageController view] setFrame:[[self.window.rootViewController view] bounds]]; UIViewController *viewC = [self viewControllerAtIndex:0];

NSArray *viewControllers =  [NSArray arrayWithObject:viewC];
[pageController setViewControllers:viewControllers  
                         direction:UIPageViewControllerNavigationDirectionForward 
                          animated:NO 
                        completion:nil];

[self.window.rootViewController addChildViewController:pageController];
[[self.window.rootViewController view] addSubview:[pageController view]];
[pageController didMoveToParentViewController:self.window.rootViewController];

[self.window makeKeyAndVisible];

return YES;

}

我正在使用 UIViewController 添加 Webview


-(void)addwebviewINCode
{
 UIViewController *viewC = [[UIViewController  alloc] initWithNibName:nil bundle:nil];

self.webVCustom = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, _window.bounds.size.width, 1004)];//20

self.webVCustom.suppressesIncrementalRendering=YES;
self.webVCustom.delegate=self;
self.webVCustom.scrollView.scrollEnabled=NO;

viewC.view=self.webVCustom;

[pageContent addObject:viewC];

}

UIPageController 委托方法


- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers {
    pageAnimationFinished = YES;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
   if (flag == FALSE) {
        NSUInteger index = [self indexOfViewController:viewController];
        if ((index == 0) || (index == NSNotFound)) {
            return nil;
        }
        index--;
        return [self viewControllerAtIndex:index];
    }else {
        flag=FALSE;
    }
    return 0;
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
   if (flag == FALSE) {
        NSUInteger index = [self indexOfViewController:viewController];
        if (index == NSNotFound) {
            return nil;
        }
        index++;
        if (index == [self.pageContent count]) {
            return nil;
        }
        return [self viewControllerAtIndex:index];
    }else {
        flag=FALSE;
    }
    return 0;
}

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed { UIViewController *viewC = [previousViewControllers objectAtIndex:0]; NSInteger ind = [self getVCIndex:viewC]; NSInteger indCur = [self getVCIndex:[pageViewController.viewControllers objectAtIndex:0]]; if (ind == indCur) { indCurrentView=ind; }else { indCurrentView=indCur; } if (completed || finished) // Turn is either finished or aborted pageAnimationFinished = NO; }

-(UIViewController *)viewControllerAtIndex:(NSUInteger)index { // Return the data view controller for the given index. if ((index >= [self.pageContent count])) { return nil; } // Create a new view controller and pass suitable data. UIViewController viewC = (UIViewController)[pageContent objectAtIndex:index];

return viewC;

}

-(NSUInteger)indexOfViewController:(UIViewController *)viewController { return [self.pageContent indexOfObject:viewController]; }

-(NSInteger)getVCIndex:(UIViewController*)viewCon { if ([pageContent containsObject:viewCon]) { return [pageContent indexOfObject:viewCon]; } return 0; }

为什么这件事会发生,因为它在 iPad2 中工作正常,但只在 iPad3 中给出内存警告和崩溃

谁能帮我解决这个问题?我花了太多天来解决这个问题..

谢谢

4

1 回答 1

0

看起来引用的代码会预先生成所有视图控制器。您应该考虑仅在 UIPageViewController 请求它们时创建视图控制器。

对于初始 setViewControllers:direction:animated:completion: 调用,向其发送一个数组,其中仅包含最初应显示的视图控制器(第一页)。

在 pageViewController:viewControllerBeforeViewController: 和 pageViewController:viewControllerAfterViewController: 中,它将创建一个新的视图控制器,表示应该在传递参数的视图控制器中包含的内容之前或之后显示的内容,而不是将索引引用到数组中。

这样您就不需要一次加载所有可能导致问题的页面(尤其是 UIWebViews)。

于 2013-12-06T19:30:21.807 回答