【问题标题】:Hiding a Master View Controller when Selection is Made with Xcode 4.3.2 Storyboards使用 Xcode 4.3.2 故事板进行选择时隐藏主视图控制器
【发布时间】:2012-05-09 02:30:46
【问题描述】:

我想在 iPad 处于纵向视图时选择单元格时隐藏主视图控制器。因此用户将单击单元格,然后主视图控制器将消失(就像在邮件中一样)。我将在哪里以及如何做到这一点?

本项目开源:https://github.com/kirkouimet/enzyme

【问题讨论】:

    标签: ipad ios5 uiviewcontroller uisplitviewcontroller uistoryboard


    【解决方案1】:

    配置详细视图控制器后,您需要关闭弹出框控制器。

    if (self.popoverController) {
        [self.popoverController dismissPopoverAnimated:YES];
    }
    

    如果您的详细视图控制器还没有保存UIPopoverController 的属性,您可以通过为UISplitViewControllerDelegate 实现这些委托方法来捕获它

    - (void)splitViewController:(UISplitViewController *)iSplitViewController
         willHideViewController:(UIViewController *)iViewController
              withBarButtonItem:(UIBarButtonItem *)iBarButtonItem
           forPopoverController:(UIPopoverController *)iPopoverController {
    
        self.popoverController = iPopoverController;
    }
    
    
    - (void)splitViewController:(UISplitViewController *)iSplitViewController
         willShowViewController:(UIViewController *)iViewController
      invalidatingBarButtonItem:(UIBarButtonItem *)iBarButtonItem {
    
        self.popoverController = nil;
    }
    

    【讨论】:

    • 这不是第一次工作,因为 willHideViewController 在您的设备方向改变之前不会被调用,并且最终 self.popoverController 仍然未分配。请指教。
    【解决方案2】:

    注册以获取有关您详细视图的通知。

    1)在您的详细视图上注册以获取通知。

    - (void) viewDidLoad
    
     {
    
            //for showing loginview
            [[NSNotificationCenter defaultCenter] addObserver:self  
            selector:@selector(dismissPop) name:@"MASTERROWSELECTED" object:nil];
    
      } 
    

    2) 在 didSelectRowAtIndexPath 的主视图上执行此操作;

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
             //do normal things you usually do
    
            //post notification that row is selected and you need to dismiss popover.
    
            [[NSNotificationCenter defaultCenter] postNotificationName:@"MASTERROWSELECTED" 
             object:nil];
    
      }
    

    3) 在您的详细视图上编写此方法。

    - (void)dismissPop
    {
    
          if(self.interfaceOrientation == UIInterfaceOrientationPortrait)
          {
    
                 //self.popover is your reference to master view pop 
                 if([self.popover isPopoverVisible])
                 {
                     [self.popover dismissPopoverAnimated:YES];
                 }
          }
    
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用自定义的 SplitViewController 来实现这一点,例如 Matt Gemmell 的 MGSplitViewController。特别是,此实现向控制器添加了一个toggleMasterView: 方法,您可以从didSelectRowAtIndexPath: 中调用该方法。

      【讨论】:

      • 此时切换到 MGSplitViewController 对我来说有多难?您能为我概述基本说明吗?我需要从头开始吗?
      • 您不需要从头开始。来自库存 UISplitViewController 的所有 API/委托方法都是相同的,因此您应该能够将库存控制器切换为新控制器。我在项目页面上看到的唯一警告是它在 IB(故事板编辑器)中可能不会完全一样,但是如果您实例化控制器的实例并设置主 VC 和详细 VC 出口,您应该没问题。 (免责声明:我自己没有使用过这个,所以我很想知道这是否像我想象的那么简单。)
      • 这样做的唯一问题是MGSplitViewController 不是 UISplitViewController 的后代,所以你不能使用拆分视图控制器布局和交互故事板。您必须以编程方式管理所有这些。
      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      相关资源
      最近更新 更多