Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 细节更换后UISplitView按钮缺失_Ios_Objective C_Ipad_Uisplitviewcontroller_Master Detail - Fatal编程技术网

Ios 细节更换后UISplitView按钮缺失

Ios 细节更换后UISplitView按钮缺失,ios,objective-c,ipad,uisplitviewcontroller,master-detail,Ios,Objective C,Ipad,Uisplitviewcontroller,Master Detail,我有一个主细节iPad界面,设置了故事板,在细节视图控制器上提供了一个替换序列。这可以很好地替换详图控制器,但是在某些情况下,显示主控制器的条形按钮缺失 如果我在纵向中执行此步骤,则缺少条形按钮,因为从未调用willihidevewcontroller:delegate方法。当从主控制器调用prepareforsgue:时,我正在将委托设置为新的细节控制器 当按钮缺失时,我可以将iPad旋转到横向,然后再回到纵向,然后按钮就会出现 在prepareforsgue: UINavigationCon

我有一个主细节iPad界面,设置了故事板,在细节视图控制器上提供了一个替换序列。这可以很好地替换详图控制器,但是在某些情况下,显示主控制器的条形按钮缺失

如果我在纵向中执行此步骤,则缺少条形按钮,因为从未调用
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(正在被替换的)来解决这个问题

这些步骤是:

  • 将barButton作为属性存储在UISPlitViewDeleteGate方法中

    因此,在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;
    
    }
    
  • 现在在-(void)视图中读取存储的值并显示。如果barButton显示在要替换的viewController中,则当前VC将显示它

      [self.navigationItem setLeftBarButtonItem:self.rootPopoverButtonItem animated:YES];
    
  • 现在在主视图控制器中,在prepareForSegue中包括以下内容

          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)