Ios Can';我找不到添加uibarbuttonite的地方

Ios Can';我找不到添加uibarbuttonite的地方,ios,objective-c,uinavigationcontroller,uibarbuttonitem,uipageviewcontroller,Ios,Objective C,Uinavigationcontroller,Uibarbuttonitem,Uipageviewcontroller,我在NavigationController中有一个UIPageViewController,UIPageViewController提供的其中一个ViewController需要能够向导航栏添加“保存”按钮 问题是我找不到任何导航栏的访问权限,所以我设置了一个断点并开始挖掘它,但我似乎找不到任何可以访问NavigationController或其属性的地方 这就是我发现的: (lldb) po self.toolbarItems $9 = 0x00000000 <nil>

我在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>
(lldb)采购订单自助工具栏项目
$9=0x00000000
(lldb)po self.parentViewController
$10=0x1e070bc0
(lldb)po self.parentViewController.toolbarItems
$11=0x00000000
(lldb)po self.parentViewController.navigationController
$12=0x00000000
(lldb)po self.parentViewController.view
$13=0x1d585960
(lldb)po self.parentViewController.view.window
$14=0x1e073750
(lldb)po self.parentViewController.view.window.rootViewController
错误:在“id”类型的对象上找不到属性“rootViewController”
错误:1解析表达式时出错
(lldb)采购订单自动呈现视图控制器
$15=0x00000000
我尝试在我的VC和父VC中设置我的RightBarButtonim,甚至尝试转到topViewController和rootViewController


是否有人能就我在哪里可以访问NavigationController提供任何其他建议?

您需要将其放入UIViewController子类中

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.parentViewController.navigationItem.rightBarButtonItem = ...
}
该解决方案的唯一问题是,苹果可以随时更改UIPageViewController实现,以获得更高级别的视图控制器控制。更安全的解决方案是:

在UIViewController子类.h中添加:

@property (nonatomic, weak) UIPageViewController *pageViewController;
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _pageViewController.navigationItem.rightBarButtonItem = ...
}
.m中添加:

@property (nonatomic, weak) UIPageViewController *pageViewController;
-(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;
        }
    }
}

最终得到了另一种可能比parentViewController更可靠的方法

例如,UIPageViewController中的嵌套UIViewController无法通过直接提供其UIBarButtonim项

self.navigationItem
只有UINavigationController的直接子级可以做到这一点

但是嵌套的UIViewController可以通过访问UINavigationController

self.navigationController
至少在ViewWillDisplay/ViewDidDisplay中出现-不幸的是,在viewDidLoad中为零

UINavigationController中最顶层的UIViewController肯定位于嵌套UIViewController的parentViewController层次结构中

因此,与其使用UINavigationController最顶部的UIViewController来设置导航项,而不是单步转到(可能更多)ParentViewController:

[[[self.navigationController.viewControllers lastObject] navigationItem] setLeftBarButtonItem:barButton];

我建议您创建一个方法来获取如下所示的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 = ...

唯一正确的方法是
self.navigationItem.RightBarButtonim=…
。如果它不适用于您,请确保您的VC位于NavigationController层次结构中。谢谢标记,但棘手的是,我的UIPageViewController位于层次结构中,它正在加载我需要保存按钮的VC。所以从技术上讲,我的VC不属于层次结构,但它是由不属于层次结构的东西加载的。我可能不得不把按钮放在其他地方。我喜欢这个答案,我相信它会起作用,但我真的不希望UIPageViewController的每个页面都有按钮,所以我正在寻找一种方法来添加和删除它,具体取决于显示的页面。除非加载后无法修改导航栏,但我相信是的。虽然这不是我想要的答案,但这是最好的解决方案。我认为,添加一个协议来启用/禁用UIPageViewController中的按钮可能就是实现这一点的方法。谢谢你的帮助,尼克!我编辑了我的答案以解决您的其他要求。您可以这样做,也可以在其他UIViewController子类中覆盖“ViewWillExample”,并将RightBarButtonim设置为nil以删除按钮。很好!我喜欢,这也是一个放置它的好地方。谢谢你的更新,尼克!