9

UIPageViewController は、最初のコンテンツ ビュー コントローラーを永久に保持しているようです。例えば:

DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
self.pageViewController.dataSource = self.modelController;

startingViewControllerは、pageViewController 自体が解放されるまで解放されません。

このバグを再現するには、ページベース アプリケーション テンプレートを使用して XCode で新しいプロジェクトを作成します。そして、DataViewController.m に 3 行のコードを追加します。

@property NSInteger debugIndex; // file scope
NSLog(@"DataViewController[%d] created", self.debugIndex); // in viewDidLoad
NSLog(@"DataViewController[%d] dealloc", self.debugIndex); // in dealloc

デモ アプリを縦方向にスクロールすると、次のようなログが表示されます。

DataViewController[0] created  
DataViewController[1] created  
DataViewController[2] created  
DataViewController[1] dealloc  
DataViewController[3] created  
DataViewController[2] dealloc  
DataViewController[4] created  
DataViewController[3] dealloc  
DataViewController[5] created  
DataViewController[4] dealloc  
DataViewController[6] created  
DataViewController[5] dealloc  

DataViewController[0]の割り当てが解除されることはありません。

これについてのアイデアはありますか?ありがとう!

4

5 に答える 5

3

まだ問題があるかどうかはわかりませんが、同じ問題があり、解決策を見つけました。

理由はわかりませんが、うまくいきます。

最初の viewController を のaddSubview前ではなく の直後に設定していaddChlidViewControllerます。

-(void)settingPageViewController{
if (!self.pageViewController) {
    self.pageViewController = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    self.pageViewController.delegate = self;
    self.pageViewController.dataSource = self;
    [self addChildViewController:self.pageViewController];
    [self.pageViewController didMoveToParentViewController:self];
    [self.containerView addSubview:self.pageViewController.view];
    [self.pageViewController setViewControllers:@[[self viewcontrollerAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}    
}

最初のviewControllerは適切なタイミングで解放されます。

また、私は呼び出した場合に見つけました

        [self.pageViewController setViewControllers:@[[self viewcontrollerAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:^(BOOL finished){
        NSLog(@"finished : %d",finished);
    }];

addSubViewと完了ブロックは呼び出されません。

そして、このブロックが最初のviewControllerが解放されなかった理由だと思います。

コールバックしなかった理由を調べて、答えを改善します〜

乾杯

于 2015-07-23T09:35:28.427 に答える
1

同様の問題で何が起こっているのかを把握しようと何度か試みた後、私のプロジェクトには、保持の問題を引き起こし、UIPageViewController が永久に保持される 2 つの理由があることに気付きました。

1) 提示された UIPageViewController と UIViewcontroller の間に循環参照がありました (これは、両方のクラスでプロパティを弱いから強いに変更することで修正されました)

2)そして主な修正は変更することでした

[self setViewControllers:@[initialDetailsViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

__weak __typeof__(self) weakSelf = self;
    [weakSelf setViewControllers:@[initialDetailsViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

これが誰かに役立つことを願っています

于 2016-08-26T13:19:56.770 に答える
0

ここで同じ問題を解決しました変数に最初のviewControllerを保持し、特定のpageIndexで同じVCを作成する代わりに、それを再利用します

于 2016-12-10T13:33:32.937 に答える
-1

私は同じ問題を抱えていて、以下を解決しました:

[startingViewController release];初期化の終点。

次に、最初の ViewController の割り当てが解除されます。

于 2013-06-07T08:28:11.603 に答える