【问题标题】:Multi-level navigation controller on left-hand side of UISplitView with a small twistUISplitView 左侧的多级导航控制器,带有一个小扭曲
【发布时间】:2011-02-20 05:46:28
【问题描述】:

我正在尝试制作与 iPad 上的电子邮件应用程序相似(但不完全相同)的东西。

具体来说,我想创建一个基于标签的应用,但每个标签都会向用户呈现不同的 UISplitView

每个 UISplitView 都包含一个 Master 和一个 Detail 视图(显然)。

在每个 UISplitView 中,我希望 Master 成为一个多级导航控制器,其中新的 UIViewController 被推入(或弹出)堆栈。 UISplitView 中的这种类型的导航是应用程序类似于本机电子邮件应用程序的地方。

据我所知,唯一描述一个体面的“uitabbarcontroller 中的 splitviewcontroller”的地方是:UISplitViewController in a TabBar ( UITabBarController )?,我已经尝试遵循公认的答案。

公认的解决方案似乎对我有用(即,我得到一个标签栏控制器,允许我在不同的 UISplitView 之间切换)。

问题是我不知道如何让 UISplitView 的左侧成为一个多级导航控制器。

这是我在应用程序委托中使用的代码,用于创建初始“标签栏控制器内部的拆分视图”(与上述链接中的建议几乎相同)。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSMutableArray *tabArray = [NSMutableArray array];

    NSMutableArray *array = [NSMutableArray array];
    UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
    MainViewController *viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    [array addObject:viewCont];
    [viewCont release];
    viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    [array addObject:viewCont];
    [viewCont release];
    [splitViewController setViewControllers:array];
    [tabArray addObject:splitViewController];
    [splitViewController release];



    array = [NSMutableArray array];
    splitViewController = [[UISplitViewController alloc] init];
    viewCont = [[Master2 alloc] initWithNibName:@"Master2" bundle:nil];
    [array addObject:viewCont];
    [viewCont release];
    viewCont = [[Slave2 alloc] initWithNibName:@"Slave2" bundle:nil];
    [array addObject:viewCont];
    [viewCont release];
    [splitViewController setViewControllers:array];
    [tabArray addObject:splitViewController];
    [splitViewController release];

        // Add the tab bar controller's current view as a subview of the window
    [tabBarController setViewControllers:tabArray];

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    return YES;
}

MainViewController 类是一个 UIViewController,包含以下方法:

- (IBAction)push_me:(id)sender {
    M2 *m2 = [[[M2 alloc] initWithNibName:@"M2" bundle:nil] autorelease];
    [self.navigationController pushViewController:m2 animated:YES];
}

此方法附加(通过界面生成器)到 MainViewController.xib 中的 UIButton 显然,上面的方法 (push_me) 应该创建第二个 UIViewController(称为 m2)并在按下 UIButton 时将 m2 推送到拆分视图左侧的视图中。 然而,当按钮被按下时它什么也不做(即使我可以知道该方法被调用了)。

想到我哪里出错了?

TIA!

【问题讨论】:

    标签: uinavigationcontroller uitabbarcontroller uisplitviewcontroller ipad


    【解决方案1】:

    你确定 MainViewController 是 UINavigationController 的子类吗?

    如果您希望能够推送/弹出控制器,那么 mainViewController 应该是一个导航控制器(或子类),然后您可以将控制器(例如 TableViewControllers)推送到它上面。你可以在默认的 splitView 项目中看到这个结构(打开 IB 并检查视图)。

    这是一个关于 UISplitViewController 的不错的教程:http://mobiforge.com/developing/story/developing-split-view-based-apps-ipad

    【讨论】:

      【解决方案2】:

      创建(多级)主导航控制器的子类并覆盖以下方法:

      - separateSecondaryViewControllerForSplitViewController:
      

      在被覆盖的方法中执行超类方法并检查是否要从中拆分返回的视图控制器,如果没有,则通过调用折叠方法将其重新合并:

      - collapseSecondaryViewController:forSplitViewController:
      

      Swift 中的模板示例:

      import UIKit
      
      class MasterNavigationController: UINavigationController {
      
          override func separateSecondaryViewControllerForSplitViewController(splitViewController: UISplitViewController) -> UIViewController? {
      
              // Separate a view controller from master navigation controller
              if let secondaryViewController = super.separateSecondaryViewControllerForSplitViewController(splitViewController) {
      
                  if /* Check if secondaryViewController is your Detail View Controller (you can check for its class or restorationIdentifier for example) */ {
      
                      return secondaryViewController
      
                  } else {
      
                      // Remerges the separated view controller back to the master navigation controller
                      super.collapseSecondaryViewController(secondaryViewController, forSplitViewController: splitViewController)
                  }
              }
              return nil
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 2015-06-03
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        相关资源
        最近更新 更多