我在NavigationController中有一个UIPageViewController,并且由UIPageViewController呈现的ViewController之一需要能够在导航栏中添加“保存”按钮。

问题是我找不到对导航栏的任何访问权限,因此我设置了一个断点并开始对其进行挖掘,而我似乎找不到在哪里可以访问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提出其他建议吗?

最佳答案

您需要将其放在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;
        }
    }
}

关于ios - 找不到添加UIBarButtonItem的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15437458/

10-14 22:03
查看更多