2011-12-19 3 views
2

Я пишу небольшое приложение для использования результатов в веб-сервисе. Результаты представлены в SplitViewController, с левой стороны - результаты, а с правой стороны - детали. Прежде чем получать результаты, я прошу пользователя войти в систему через экран входа в систему, который появляется сначала, когда приложение должно начинаться.Вход с ViewController в 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]; 
} 

Я использую раскадровки 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];} 

До сих пор все работает, но теперь у меня есть кнопка выхода из системы в PopoverView на detailViewController моего SplitView, вытекающей экран входа в систему. Я думал, что я мог бы сделать это так же, так что я сделал:

- (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: allowedArrowDirections: animated:]: всплывающие окна не могут быть представлены из представления, у которого нет окна.'

У меня нет идеи, почему это работает в первый раз, и во второй раз у меня возникают эти проблемы.

Может ли кто-нибудь помочь мне или дать мне подсказку? Может быть, это неправильная концепция для обработки логина?

UPDATE:

проблема появляется именно в этой части:

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

Уйдя в линию: [appDelegate.window setRootViewController: CVC];

+0

Я бы посмотрел, кто владеет 'currentPopover' и как вы его создаете. Класс UIPopoverController ref говорит: «При инициализации экземпляра этого класса вы должны предоставить контроллер представления, который предоставляет контент для popover». Вы это делаете? Что произойдет, если вы вызовете его accessoverController? Вызывает ли он UIViewController, как ожидалось? – Wienke

+0

Попутчики определены в раскадровке с помощью ViewController и BarButton. Сег идет от BarButton к ViewContoller и определяется как popover. Но я проверю вашу идею, спасибо за подсказку :) –

ответ

1

Я реализовал то же самое с помощью пользовательского segue. Кажется, это сработало и намного проще.

@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 
0

Для тех, кто ищет подобных ответов:

Я использовал свойство UISplitViewController.preferredDisplayMode создать этот же рабочий процесс: экран входа в систему для разделения экрана мастер Tableview на левой стороне, DetailView справа.

FWIW, встроенные навигационные контроллеры, как SplitViewController 'Master' и 'Detail', и приложение поддерживают только ориентацию ландшафта.

При запуске приложения главный вид (слева) - это любой вид ViewController, который вы хотите показать слева после входа в систему. Детальный вид (справа) - это экран входа в систему.В лог-в ViewController viewWillAppear дополнения (Swift)

self.splitScreenController?.preferredDisplayMode = .primaryHidden 

Это представит экран входа в систему, как на одном экране, а не разделенного экрана. После успешного входа в систему, представите контроллер подробных представлений, который вы хотите отобразить. В prepareForSegue из журнала-в ВК или viewDidLoad из DetailVC, вызовите

self.splitScreenController?.preferredDisplayMode = .automatic 

показать регулярные Master/Detail разделенного экрана. Или,

self.splitScreenController?.preferredDisplayMode = .allVisible 

Чтобы заставить экран разделения отображаться на портрете.

При выходе пользователя из системы я вызываю popToRootViewController на обоих контроллерах навигации для возврата в режим просмотра.

Легко, не возиться с окнами или сбросить корневые представления.

Смежные вопросы