gpt4 book ai didi

ios - 不同的初始 View Controller

转载 作者:行者123 更新时间:2023-11-28 22:06:54 25 4
gpt4 key购买 nike

我正在构建一个应用程序,用户可以在其中从另一个 ViewController 中选择一个项目,然后打开一个拆分的 ViewController。我发现我无法将另一个 ViewController 设置为初始值,但我想到了第二个解决方案。

我将 Split View设置为初始 View ,并导航到 viewDidAppear 方法上的假初始 ViewController,就好像它是初始 View 一样。然后在全局变量中设置所选项目并关闭项目页面,如下所示:

[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?这样它就不会认为这个 viewcontroller 会“托管”splitview?

编辑 3:

// Close the ProjectsViewController and open the selected project
[self presentViewController:_detailViewController animated:YES completion:^{
[[[[UIApplication sharedApplication] delegate] window] setRootViewController:_detailViewController];
}];

编辑 4:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图以模态方式呈现 Split View Controller ”

方法与按钮链接:

-(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];
}];
}

最佳答案

最好设置窗口的rootViewController

[[[[UIApplication sharedApplication] delegate] window] 
setRootViewController:yourViewController];

编辑:这是如何从 Storyboard实例化 View Controller 的代码,

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"];

确保在 Storyboard、Identity Inspector 选项卡、splitVC(例如)中为 View Controller 设置 Storyboard ID

编辑: 所以,UISplitViewController 本身就是一个容器 View Controller ,因此我们不能将它保存在 UINavigationController、UITabBarController 中,添加为 childViewController 等。而且我们也不能呈现它模态地,因此我们没有得到动画演示。 UISplitViewController 应该是窗口的 rootViewController。在 rootViewController 和 splitViewController 之间获得动画转换的最简单方法是使用 UIView 的 transitionFromView 类方法并在视觉上交换它们的 View ,同时更改 rootViewController 属性。这是您编辑的代码。

- (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];
}];
}

关于ios - 不同的初始 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23754122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com