UISplitView左侧的多级导航控制器,带有小扭曲

时间:2010-05-17 02:25:48

标签: uinavigationcontroller uitabbarcontroller uisplitviewcontroller ipad

我正在尝试与 iPad 上的电子邮件应用进行类似(但不完全相同)。

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

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

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

据我所知,唯一一个在uitabbarcontroller中描述了一个体面的“splitviewcontroller”的地方就在这里:UISplitViewController in a TabBar ( UITabBarController )?我试图按照接受的答案。

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

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

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

- (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!

2 个答案:

答案 0 :(得分:0)

您确定MainViewController是UINavigationController的子类吗?

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

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

答案 1 :(得分:0)

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

- separateSecondaryViewControllerForSplitViewController:

在overriden方法中执行超类方法并检查是否要从中拆分返回的视图控制器,如果没有,则通过调用collapse方法重新合并它:

- 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
    }
}