2011-10-21 19 views
0

私はいくつかの詳細コントローラと小さなアプリケーションを持っています。詳細コントローラは、スクロールビュー内に置くウェブビューである:ここで は、詳細ビューコントローラのコードです:スクロールビュー内のiPhoneのWebビュー

- (void)loadScrollViewWithPage:(int)page 

{

if (page < 0) 
    return; 
if (page >= detailTotalJobs) 
    return; 

// replace the placeholder if necessary 
SearchJobDetailWebViewController *controller = [viewControllers objectAtIndex:page]; 
if ((NSNull *)controller == [NSNull null]) 
{ 



    NSLog(@"Vytvaram web controller: %d", page + 1); 

    if (detailJobIndex == page) { 

     controller = [[SearchJobDetailWebViewController alloc] initWithNibName:@"SearchJobDetailWebViewController" bundle:nil page:page url:detailExportUrl]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 

    } else if (detailJobIndex + 1 == page) { 

     controller = [[SearchJobDetailWebViewController alloc] initWithNibName:@"SearchJobDetailWebViewController" bundle:nil page:page url:detailNextExportUrl]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 

    } else { 

     [self performSelector:@selector(downloadData:) withObject:[NSNumber numberWithInt:page] afterDelay:0.1]; 
     //[self downloadData:[NSNumber numberWithInt:page]]; 

     controller = [[SearchJobDetailWebViewController alloc] initWithNibName:@"SearchJobDetailWebViewController" bundle:nil page:page url:nextArray.exportUrl]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 

    } 

} 

// add the controller's view to the scroll view 
if (controller.view.superview == nil) 
{ 

    CGRect frame = scrollView.frame; 
    frame.origin.x = frame.size.width * page; 
    frame.origin.y = 0; 
    controller.view.frame = frame; 
    [scrollView addSubview:controller.view]; 

    //NSDictionary *numberItem = [self.contentList objectAtIndex:page]; 
    //controller.numberImage.image = [UIImage imageNamed:[numberItem valueForKey:ImageKey]]; 
    //controller.myLabel.text = @"Test"; 
} 

}

- (void)scrollViewDidScroll:(UIScrollView *)sender 

{ //我々ドンUIPageControlとスクロールデリゲートの間の「フィードバックループ」を にしたいですか?//ユーザーがページに当たってスクロールイベントを生成しましたコントロールは //デリゲートメソッドからの更新をトリガします。ページコントロールが使用されている場合、ブール値を使用してデリゲートロジックを無効にします。 if(pageControlUsed) { //何もしない - ユーザーがドラッグするのではなく、ページコントロールからスクロールを開始しました。 return;アップルのページコントロールに触発 }

// Switch the indicator when more than 50% of the previous/next page is visible 
CGFloat pageWidth = scrollView.frame.size.width; 
int page = floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 
pageControl.currentPage = page; 

NSString *detailTitleText = [NSString stringWithFormat:@"%d/%d", page + 1, detailTotalJobs]; 
[self setTitle:detailTitleText]; 
//[detailTitleText release]; 

// load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling) 
[self loadScrollViewWithPage:page - 1]; 
[self loadScrollViewWithPage:page]; 
[self loadScrollViewWithPage:page + 1]; 

// A possible optimization would be to unload the views+controllers which are no longer visible 

}

コード。

問題はここにある:

if (detailJobIndex == page) { 

     controller = [[SearchJobDetailWebViewController alloc] initWithNibName:@"SearchJobDetailWebViewController" bundle:nil page:page url:detailExportUrl]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 

    } else if (detailJobIndex + 1 == page) { 

     controller = [[SearchJobDetailWebViewController alloc] initWithNibName:@"SearchJobDetailWebViewController" bundle:nil page:page url:detailNextExportUrl]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 

    } else { 

     [self performSelector:@selector(downloadData:) withObject:[NSNumber numberWithInt:page] afterDelay:0.1]; 
     //[self downloadData:[NSNumber numberWithInt:page]]; 

     controller = [[SearchJobDetailWebViewController alloc] initWithNibName:@"SearchJobDetailWebViewController" bundle:nil page:page url:nextArray.exportUrl]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 

    } 

第1の部分と、正しく作業する場合の第二部、私が最初にWeb表示用と第二のウェブビューのデータを持っているので。

しかし最後の部分に問題があります。 2番目のWebビューから3番目のWebビューにスクロールすると、スクロールビューで空白ページが表示されます。次のページは正しく動作します。 どこに問題がありますか?

+0

私の答えが助けられた場合、あなたは答えを受け入れてください/ upvoteできますか? – Oliver

答えて

0

デバッグモードでブレークポイントをブレースに配置するだけです。
コントローラはnilですか? カスタムinitメソッドを確認してください。

問題がある場合はnilを返しますか?

[self = super initWithNibName..................]; 
if (!self) return nil; 

// some inits 

return self; 

これが完了し、コントローラがnilの場合は、URLを確認してWebブラウザで試してください。それは現れますか?

webViewをどのように満たしていますか?それを満たすときにエラーが返されますか?エンコードに問題はありませんか?

まあ、いくつかのコードが役立ちますが、これらの兆候は最もよくある問題です。

+0

まずはこのメソッドを呼び出します:[self performSelector:@selector(downloadData :) withObject:[NSNumber numberWithInt:page] afterDelay:0.1];データをダウンロードするために、私はWeb View Controllerを作成します。問題は、私はこの2つのメソッドをログに記録するときです:最初のログは、Web View Controllerの作成であり、ダウンロードデータメソッド(コントローラはURLをnullとして取得)を呼び出しましたが、なぜですか... – mysho

+0

私はバックグラウンドで次のデータをダウンロードする必要があります... 3番目のページが空で3番目のページのデータが裁判所にあるので、最初の2番目のアプリからのスクロールがバックグラウンドで次のページをダウンロードする必要がある(ここでは問題)ページ...次のページは正常に動作します... – mysho

+0

なぜコールを遅らせますか?それがあなたの問題の原因になります。なぜメソッドを呼び出さないのですか?コントローラは、データがロードされる前に作成されます。 0.1秒で、計算時間が膨大になります。 DownloadDataはasyncと呼ばれていますので、ダウンロードする前にコントローラーを作成するのは、 – Oliver

関連する問題