0

NavigationControllerにUIPageViewControllerがあり、UIPageViewControllerによって表示されるViewControllerの1つが、ナビゲーションバーに[保存]ボタンを追加できる必要があります。

問題は、ナビゲーションバーへのアクセスが見つからないことです。そこで、ブレークポイントを設定して掘り始めましたが、NavigationControllerまたはそのプロパティへのアクセスがある場所が見つからないようです。

これは私が見つけたものです:

(lldb) po self.toolbarItems
    $9 = 0x00000000 <nil>

(lldb) po self.parentViewController
    $10 = 0x1e070bc0 <UIPageViewController: 0x1e070bc0>

(lldb) po self.parentViewController.toolbarItems
    $11 = 0x00000000 <nil>

(lldb) po self.parentViewController.navigationController
    $12 = 0x00000000 <nil>

(lldb) po self.parentViewController.view
    $13 = 0x1d585960 <_UIPageViewControllerContentView: 0x1d585960; frame = (0 0; 320 
    416); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 
    0x1d5a1090>>

(lldb) po self.parentViewController.view.window
    $14 = 0x1e073750 <UIWindow: 0x1e073750; frame = (0 0; 320 480); layer = 
    <UIWindowLayer: 0x1e0756a0>>

(lldb) po self.parentViewController.view.window.rootViewController
    error: property 'rootViewController' not found on object of type 'id'
    error: 1 errors parsing expression

(lldb) po self.presentingViewController
    $15 = 0x00000000 <nil>

私は自分のVCと親VCにrightBarButtonItemを設定しようとしましたが、topViewControllerとrootViewControllerにも移動しようとしました。

NavigationControllerにアクセスできる場所について、他に何か提案はありますか?

4

3 に答える 3

2

これを UIViewController サブクラスに入れる必要があります

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.parentViewController.navigationItem.rightBarButtonItem = ...
}

このソリューションの唯一の問題は、Apple がいつでも UIPageViewController の実装を変更して、より多くのレベルのビュー コントローラーを含めることができることです。より安全な解決策は次のとおりです。

UIViewController サブクラス.hに以下を追加します。

@property (nonatomic, weak) UIPageViewController *pageViewController;

.mに追加:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _pageViewController.navigationItem.rightBarButtonItem = ...
}

次に、pageViewController を適切な場所のプロパティに割り当てることを忘れないでください

myViewController.pageViewController = myPageViewController;

次のように、UIPageViewControllerDelegate メソッドで UIPageViewController navigationItem のプロパティをリセットできます。

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
    if (completed) {
        UIViewController *viewController = [pageViewController.viewControllers lastObject];
        if (![viewController isKindOfClass:[CustomBarButtonItemViewController class]]) {
            pageViewController.navigationItem.rightBarButtonItem = nil;
        }
    }
}
于 2013-03-15T17:15:35.443 に答える
0

下記のように、navigationItem を取得するメソッドを作成することをお勧めします。pageViewController がどこにあっても常に機能します。

- (UINavigationItem*) getNavigationItem{
UIViewController* viewController = self;
do
{
    if ([viewController.parentViewController isKindOfClass:[UINavigationController class]])
        return viewController.navigationItem;

    viewController = viewController.parentViewController;
}
while (viewController.parentViewController);

return nil;

}

このように使用できます:

[self getNavigationItem].rightBarButtonItem = ...
于 2016-07-14T08:44:23.957 に答える
0

parentViewController よりも信頼性の高い別のアプローチに行き着きました。

たとえば、UIPageViewController でネストされた UIViewControllers のように見えるため、UIPageViewController は UIBarButtonItem アイテムを介して直接提供できませんでした。

self.navigationItem

UINavigationController の直接の子だけがそれを行うことができます。

ただし、ネストされた UIViewControllers は、UINavigationController を介してアクセスできます。

self.navigationController

少なくともviewWillAppear / viewDidAppearでは - 残念ながらviewDidLoadではnilです。

UINavigationController の最上位の UIViewController は、ネストされた UIViewController の parentViewController 階層に確実に含まれています。

したがって、UINavigationController の最上位の UIViewController を使用して (おそらくそれ以上の) parentViewControllers にステップする代わりに、navigationItems を設定します。

[[[self.navigationController.viewControllers lastObject] navigationItem] setLeftBarButtonItem:barButton];
于 2013-12-30T10:29:41.327 に答える