繁体   English   中英

从ViewController登录到SplitViewController

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM