Ios Can';我找不到添加uibarbuttonite的地方
我在NavigationController中有一个UIPageViewController,UIPageViewController提供的其中一个ViewController需要能够向导航栏添加“保存”按钮 问题是我找不到任何导航栏的访问权限,所以我设置了一个断点并开始挖掘它,但我似乎找不到任何可以访问NavigationController或其属性的地方 这就是我发现的: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>
(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以删除按钮。很好!我喜欢,这也是一个放置它的好地方。谢谢你的更新,尼克!