Я пишу небольшое приложение для использования результатов в веб-сервисе. Результаты представлены в 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];
Я бы посмотрел, кто владеет 'currentPopover' и как вы его создаете. Класс UIPopoverController ref говорит: «При инициализации экземпляра этого класса вы должны предоставить контроллер представления, который предоставляет контент для popover». Вы это делаете? Что произойдет, если вы вызовете его accessoverController? Вызывает ли он UIViewController, как ожидалось? – Wienke
Попутчики определены в раскадровке с помощью ViewController и BarButton. Сег идет от BarButton к ViewContoller и определяется как popover. Но я проверю вашу идею, спасибо за подсказку :) –