Ios 细节更换后UISplitView按钮缺失
我有一个主细节iPad界面,设置了故事板,在细节视图控制器上提供了一个替换序列。这可以很好地替换详图控制器,但是在某些情况下,显示主控制器的条形按钮缺失 如果我在纵向中执行此步骤,则缺少条形按钮,因为从未调用Ios 细节更换后UISplitView按钮缺失,ios,objective-c,ipad,uisplitviewcontroller,master-detail,Ios,Objective C,Ipad,Uisplitviewcontroller,Master Detail,我有一个主细节iPad界面,设置了故事板,在细节视图控制器上提供了一个替换序列。这可以很好地替换详图控制器,但是在某些情况下,显示主控制器的条形按钮缺失 如果我在纵向中执行此步骤,则缺少条形按钮,因为从未调用willihidevewcontroller:delegate方法。当从主控制器调用prepareforsgue:时,我正在将委托设置为新的细节控制器 当按钮缺失时,我可以将iPad旋转到横向,然后再回到纵向,然后按钮就会出现 在prepareforsgue: UINavigationCon
willihidevewcontroller:
delegate方法。当从主控制器调用prepareforsgue:
时,我正在将委托设置为新的细节控制器
当按钮缺失时,我可以将iPad旋转到横向,然后再回到纵向,然后按钮就会出现
在prepareforsgue:
UINavigationController *nav = [segue destinationViewController];
UIViewController *destinationViewController = nav.topViewController;
if ([destinationViewController conformsToProtocol:@protocol(UISplitViewControllerDelegate)]) {
self.splitViewController.delegate = destinationViewController;
}
else {
self.splitViewController.delegate = nil;
}
在详细信息控制器中:
#pragma mark - Split view
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = NSLocalizedString(@"MasterButton", @"Master");
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}
- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.masterPopoverController = nil;
}
我遇到了同样的情况,我通过在prepareForSegue方法中将barButton值从当前detailViewController(正在被替换)传递到目标detailViewController(正在被替换的)来解决这个问题 这些步骤是:
@property (nonatomic, strong) UIBarButtonItem *rootPopoverButtonItem;
在委托方法中:
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:
(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)pc
{
barButtonItem.title = @"Master";
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.rootPopoverButtonItem = barButtonItem; //Storing the barButton
self.masterPopoverController = pc;
}
-(void)splitViewController:(UISplitViewController *)svc willShowViewController:
(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.rootPopoverButtonItem = nil; //Storing the barButton
self.masterPopoverController = nil;
}
[self.navigationItem setLeftBarButtonItem:self.rootPopoverButtonItem animated:YES];
UISplitViewController *splitViewController = (UISplitViewController *)self.view.window.rootViewController;
UINavigationController *currentNavigationController = [splitViewController.viewControllers lastObject];
UINavigationController *navigationController = [segue destinationViewController];
DetailViewController *destinationDetailViewController=(DetailViewController *)[navigationController topViewController];
DetailViewController *currentDetailViewController =(DetailViewController *)[currentNavigationController topViewController];
splitViewController.delegate = destinationDetailViewController;//Needed for passing the delegate
if(currentDetailViewController.rootPopoverButtonItem !=nil)
{
destinationDetailViewController.rootPopoverButtonItem = currentDetailViewController.rootPopoverButtonItem;
}
这不是一个优雅的方法,但对我来说没有太多开销。如果可以使用SubstitutableDetailViewController协议,还有其他方法(更优雅)。但是它看起来太多了,而且超出了能力范围。在看了课程之后,我终于破解了它,即 发生在我身上的事情与这条线索相似。最初,SpliViewController使DetailViewController显示“展开”按钮。经过一段时间后,这将消失。 因此,最初的想法是我的SplitViewController,onViewLoad(),触及了DetailViewController。重新创建DetailViewController时,将不会再现此自定义行为。 这是我的故事板,您可以更轻松地识别代码中的对象: 请注意,主控制器和详细控制器都有导航控制器(我知道这是如何让它们与导航条一起工作的,我真的不知道,尽管我是iOS的爱好者) 因此,在逐块注释一些代码之后,在TopstuffSpliveWController中,我找到了导致这种行为的代码行:
let detailNavVC = self.childViewControllers.last as! UINavigationController
detailNavVC.topViewController!.navigationItem.leftBarButtonItem = self.displayModeButtonItem()
现在只需在每次加载DetailController时重新创建此行为:
override func viewDidLoad() {
super.viewDidLoad()
....
if (self.navigationController?.splitViewController?.collapsed == false {
self.navigationItem.leftBarButtonItem = self.navigationController?.splitViewController?.displayModeButtonItem()}
小心,如果忽略if语句,也会在单个细节控制器屏幕(如iphone4s)上隐藏back按钮!
就这样,现在一切如期 我刚刚遇到了这个问题。从情节提要加载详细视图后,似乎不会重新调用上述方法(使用新的工具栏,不带主按钮,并且不会重新调用这些委托方法)。我还没有解决方案,但如果您找到了,请分享/回答您自己的问题。您有Swift(简短)吗代码的版本?基本上你正在做的是保存上下文并在实例更改时恢复它?(来自Android程序员POV)