【发布时间】:2014-05-21 03:23:50
【问题描述】:
我正在构建一个应用程序,用户可以在其中从另一个 ViewController 中选择一个项目,然后打开一个拆分 ViewController。我发现我无法将另一个 ViewController 设置为初始值,但我已经找到了第二个解决方案。
我将拆分视图设置为初始视图,并在 viewDidAppear 方法上导航到假初始 ViewController,就好像它是初始的一样。然后将选定的项目设置在全局变量中,并像这样关闭项目页面:
[self dismissModalViewControllerAnimated:YES]
打开splitview。
我的问题: 我可以使用这种方法吗?如果应用按预期运行,苹果会批准吗?
谢谢!
编辑:
这段代码在我的AppDelegate.m里,应该改成什么?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UISplitViewController *splitviewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitviewController.viewControllers lastObject];
splitviewController.delegate = (id)navigationController.topViewController;
return YES;
}
编辑 2:
// Override point for customization after application launch.
UISplitViewController *splitviewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitviewController.viewControllers lastObject];
splitviewController.delegate = (id)navigationController.topViewController;
如何将 self.window.rootViewController 引用到 SplitViewController?这样它就不会认为这个视图控制器会“托管”拆分视图?
编辑 3:
// Close the ProjectsViewController and open the selected project
[self presentViewController:_detailViewController animated:YES completion:^{
[[[[UIApplication sharedApplication] delegate] window] setRootViewController:_detailViewController];
}];
编辑 4:
* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图以模态方式呈现拆分视图控制器
方法与按钮链接:
-(void)selectedProject {
// The user opened a project
// Override point for customization after application launch.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; // assuming your split view controller in storyboard with name "Main" in project's main bundle
UIViewController *splitViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"splitVC"];
UISplitViewController *splitviewController = (UISplitViewController *)splitViewController;
UINavigationController *navigationController = [splitviewController.viewControllers lastObject];
splitviewController.delegate = (id)navigationController.topViewController;
// Close the ProjectsViewController and open the selected project
[self presentViewController:splitViewController animated:YES completion:^{
[[[[UIApplication sharedApplication] delegate] window] setRootViewController:splitViewController];
}];
}
显示项目页面:
- (IBAction)closeProject:(id)sender {
// Show the selectSubjectBanner
_selectSubjectBanner.hidden = NO;
// Save the current subject in case the user edited it
[self saveCurrentSubject];
// Present the ProjectsViewController
[self performSegueWithIdentifier:@"projectsSegue" sender:nil];
}
}
关闭项目页面:
- (void)selectedProject {
// The user opened a project
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; // assuming your split view controller in storyboard with name "Main" in project's main bundle
UISplitViewController *splitViewController = (UISplitViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"splitVC"];
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
splitViewController.delegate = (id)navigationController.topViewController;
// Close the ProjectsViewController and open the selected project
[UIView transitionFromView:[[[[[UIApplication sharedApplication] delegate] window] rootViewController] view]
toView:splitViewController.view
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:^(BOOL finished) {
[[[[UIApplication sharedApplication] delegate] window] setRootViewController:splitViewController];
}];
}
【问题讨论】:
-
这不是一个好方法,因为即使你将用户发送到一个假的 viewController,它也会注意到你在另一个 viewController 加载后改变了
-
你能更好地解释你的问题吗?为什么你说你不能将其他视图控制器设置为初始?任何视图控制器都可以是初始视图控制器。此外,对您希望实现的架构进行更深入的解释将对任何希望帮助您的人有所帮助。
-
嗯。你知道解决这个问题的好方法吗?
-
拆分视图控制器具有故事板的首字母 - 认为文档说明了这一点。我希望用户从视图控制器中选择一个项目,然后将其发送到一个新的视图控制器 - splitviewcontroller。
-
据我所知,Apple 的文档曾经说过拆分视图控制器必须是根视图控制器(不一定是初始控制器)。但这一限制已被取消。 Take a look to the docs your self.
标签: ios objective-c uiviewcontroller uisplitviewcontroller