2011-12-19 7 views
2

나는 webservice 결과를 소비하는 작은 응용 프로그램을 작성하고 있습니다. 결과는 왼쪽의 SplitViewController에 표시되고 오른쪽에는 세부 정보가 표시됩니다. 결과를 얻기 전에 사용자가 로그인 화면을 통해 로그인하도록 요청합니다. 로그인 화면은 앱이 시작될 때마다 처음에 나타납니다. 나는 SplitViewController로 전환을위한 스토리 보드 SEGUE을 사용하고ViewController에서 SplitViewController 로의 로그인

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

하지만 더없이 아무것도하지 않습니다 나는 로그인 후 내 응용 프로그램의 RootViewController을 변경하여 로그인 프로세스를 관리

에 성공 행위. 내 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 :] : 창이없는보기에서 팝업을 표시 할 수 없습니다.'

어째서 이것이 처음으로 작동하는지, 그리고 두 번째로 이러한 문제가 발생하는지 전혀 알 수 없습니다.

누구나 나를 도와 주거나 힌트를 줄 수 있습니까? 로그인을 처리하는 것이 잘못된 개념 일 수 있습니까?

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에 대한 내용을 제공하는보기 컨트롤러를 제공해야합니다."라고 말합니다. 이러는거야? 'contentViewController' 접근자를 호출하면 어떻게됩니까? 그것은 예상대로 UIViewController를 생성합니까? – Wienke

+0

Popovers는 ViewController와 BarButton을 사용하여 스토리 보드에 정의됩니다. segue는 BarButton에서 ViewContoller로 이동하며 popover로 표시되도록 정의됩니다. 하지만 힌트를 주셔서 감사합니다. –

답변

1

사용자 정의 단락을 사용하여 동일한 기능을 구현했습니다. 이것은 효과적이고 훨씬 더 단순한 것으로 보인다. 비슷한 답을 찾고있는 사람들을위한

@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 속성을 사용 : 로그인 화면을 오른쪽, 왼쪽에 detailView을 화면 마스터있는 tableView을 분할 할 수 있습니다.

FWIW, SplitViewController 'Master'및 'Detail'로 nav 컨트롤러를 포함하고 앱은 가로 방향만 지원합니다.

앱이 시작되면 로그인 한 후 왼쪽에 표시 할 ViewController가 마스터보기 (왼쪽)입니다. 자세히보기 (오른쪽)가 로그인 화면입니다.의 ViewController 로그에 추가 viewWillAppear (SWIFT)에서

self.splitScreenController?.preferredDisplayMode = .primaryHidden 

이 아니라 분할 화면보다는 단일 화면보기로 로그 - 인 스크린을 제공한다. 로그인에 성공하면 표시하려는 상세보기 컨트롤러를 표시합니다. DetailVC의 VC에서 로그, 또는 viewDidLoad에서 prepareForSegue에서 일반 마스터/세부 사항 분할 화면을 보여

self.splitScreenController?.preferredDisplayMode = .automatic 

를 호출합니다. 또는

self.splitScreenController?.preferredDisplayMode = .allVisible 

강제로 분할 화면을 세로로 표시합니다.

사용자 로그 아웃시 두 nav 컨트롤러 모두에 popToRootViewController으로 전화하여 로그인보기로 다시 설정합니다.

Windows를 사용하거나 루트보기를 재설정하지 않아도됩니다.

관련 문제