我正在尝试与 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!
答案 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
}
}