[英]Login from a ViewController to a SplitViewController
我正在编写一个用于通过Web服务使用结果的小应用程序。 结果显示在SplitViewController中,结果显示在左侧,而细节显示在右侧。 在获得结果之前,我要求用户通过登录屏幕登录,该屏幕在应用程序启动时首先出现。
登录成功后,我通过更改应用程序的RootViewController来管理登录过程:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([[segue identifier] isEqualToString:@"LoginControllerSeque"] && [self doLogin]){
TMAppDelegate *appDelegate = (TMAppDelegate *)[[UIApplication sharedApplication]delegate];
// IPad
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UISplitViewController *cvc = (UISplitViewController *)[segue destinationViewController];
[appDelegate.window setRootViewController:cvc];
}
// Other device
else {
UINavigationController *cvc = (UINavigationController *)[segue destinationViewController];
[appDelegate.window setRootViewController:cvc];
}
[appDelegate switchToMainView];
}
else{
alertView = [[UIAlertView alloc] initWithTitle:@"access denied" message:@"access denied" delegate:self cancelButtonTitle:@"back" otherButtonTitles:nil];
[alertView show];
}
我正在使用一个Storyboard segue来切换到SplitViewController,但是如果不采取进一步措施,它不会执行任何操作。
在我的AppDelegate中,有以下部分:
- (void)switchToMainView{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
splitViewController.delegate = (id)navigationController.topViewController;
UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0];
TMMasterViewController *controller = (TMMasterViewController *)masterNavigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
} else {
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
TMMasterViewController *controller = (TMMasterViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
}
[self.window reloadInputViews];
[self.window makeKeyAndVisible];}
到目前为止,一切正常,但是现在我的SplitView的detailViewController上的PopoverView中有一个注销按钮,该按钮紧随登录屏幕。 我以为我可以用同样的方式做,所以我做了:
- (IBAction)logout:(id)sender {
[self.currentPopover dismissPopoverAnimated:NO];
TMAppDelegate *appDelegate = (TMAppDelegate *)[[UIApplication sharedApplication]delegate];
[appDelegate.window setRootViewController:[appDelegate loginViewController]];
[appDelegate switchToLoginView];
}
并在AppDelegate中:
- (void)switchToLoginView
{
[self.window reloadInputViews];
[self.window makeKeyAndVisible];
}
现在,如果我尝试第二次登录,则会出现错误: 原因:'-[UIPopoverController presentPopoverFromRect:inView:permittedArrowDirections:animated:]:无法从没有窗口的视图中显示弹出窗口。
我没有任何想法,为什么这是第一次工作,而第二次我遇到了这些问题。
谁能帮我或给我提示吗? 也许这是处理登录的错误概念?
更新:
问题恰好出现在这一部分:
// Beim IPad müssen wir uns anders verhalten als beim Phone
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
UISplitViewController *cvc = (UISplitViewController *)[segue destinationViewController];
[appDelegate.window setRootViewController:cvc];
}
通过进入Line: [appDelegate.window setRootViewController:cvc];
我使用自定义序列实现了相同的目标。 这似乎行得通,而且简单得多。
@implementation LoginSegue
- (void) perform {
NSLog(@"Do the segue you way");
UIViewController *src = self.sourceViewController;
UIWindow *window = src.view.window;
[window addSubview:[self.destinationViewController view]];
window.rootViewController = self.destinationViewController;
}
@end
对于寻求类似答案的任何人:
我使用UISplitViewController
.preferredDisplayMode
属性创建了相同的工作流程:登录屏幕用于在左侧拆分屏幕主tableView,在右侧是detailView。
FWIW,我将导航控制器嵌入为SplitViewController“主”和“详细信息”,并且应用程序仅支持横向方向。
在应用启动时,主视图(左)是您要在登录后在左侧显示的ViewController。 详细信息视图(右)是登录屏幕。 在登录ViewController的viewWillAppear
添加(快速)
self.splitScreenController?.preferredDisplayMode = .primaryHidden
这会将登录屏幕显示为单屏幕视图,而不是分屏视图。 成功登录后,显示要显示的详细视图控制器。 在登录VC中的prepareForSegue
或DetailVC的viewDidLoad
中,调用
self.splitScreenController?.preferredDisplayMode = .automatic
显示常规的“主/明细”拆分屏幕。 要么,
self.splitScreenController?.preferredDisplayMode = .allVisible
强制拆分屏幕以纵向显示。
在用户注销时,我在两个导航控制器上都调用popToRootViewController
重置为重新登录视图。
容易,不会弄乱窗口或重置根视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.