2013-08-29 43 views
2

我有2個視圖控制器的單一視圖的應用程序來呈現爲縱向和橫向不同的佈局。我已經設置了方向更改通知,並可以成功顯示第一個方向更改的橫向視圖。問題交換UIViewControllers當取向改變

1問題: 當我改變方向回縱向不顯示縱向視圖。

第二個問題: 當我改變方向回景觀橫向視圖顯示,但我得到一個警告:

試圖提出CalculatorViewControllerLandscape上CalculatorViewController誰的觀點是不是在窗口層次。

我已通過蘋果的文檔和幾個職位有類似的問題,已經找到了,答案在於使用代表團,但我一直沒能得到代表團設置正確。這裏是我的嘗試:

CalculatorViewControllerLandscape.h

@protocol SecondControllerDelegate <NSObject> 

@end 
..... 
@property(nonatomic, weak) id <SecondControllerDelegate> delegate; 

CalculatorViewController.h

@interface CalculatorViewController : UIViewController <SecondControllerDelegate> { 
.... 
} 
@property (strong) CalculatorViewControllerLandscape *landscapeVC; 

CalculatorViewCalculator.m

- (void)awakeFromNib 
{ 
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(orientationChanged:) 
              name:UIDeviceOrientationDidChangeNotification  
              object:nil]; 
// register as a delegate 
self.navigationController.delegate = (id)self; 
} 

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
     if (UIDeviceOrientationIsLandscape(deviceOrientation) && 
      !isShowingLandscapeView)   
    { 
     NSLog(@"Orientation has changed to landscape"); 
     // code here to show landscape storyboard 
     UIStoryboard *landscapeStoryboard = [UIStoryboard storyboardWithName:@"LandscapeStoryboard" bundle:nil]; 
     UIViewController *landscapeViewController = [landscapeStoryboard instantiateInitialViewController]; 
     [self presentViewController:landscapeViewController animated:YES completion:nil]; 
     isShowingLandscapeView = YES; 
    }  
    else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&    
     isShowingLandscapeView)   
    { 
     NSLog(@"Orientation has changed to portrait"); 
    [[self presentingViewController] dismissViewControllerAnimated:NO completion:nil]; 
    isShowingLandscapeView = NO; 
    } 
} 

我一直工作在這幾個小時,已經檢查了所有類似的問題,但我仍然無法弄清楚。預先感謝您的幫助。

回答

1

最佳做法是處理旋轉事件在一個單一的UIViewController,而不是使用兩個單獨的。我並不熟悉界面構建器,但通過編程方式,您可以覆蓋-(void)viewWillLayoutSubviews;並基於self.interfaceOrientation適當地佈置視圖。我建議你這樣做。

然而,在回答你的問題:

嘗試改變

[[self presentingViewController] dismissViewControllerAnimated:NO completion:nil]; 

[self dismissViewControllerAnimated:NO completion:nil]; 

這可以解決第二個問題爲好,因爲不是老橫向視圖控制器妥善解僱。

+0

嗨,尼克,感謝您的幫助。差不多了。當我按照您的建議更改代碼時,它會擺脫警告,現在視圖對於橫向和縱向都正確更改,但不會顛倒。我不明白爲什麼UIDeviceOrientationIsPortrait會對縱向進行任何不同的處理。有想法該怎麼解決這個嗎? – Sinead

+0

通過將「if(deviceOrientation!= 2)」/ /如果沒有顛倒,解決了上行問題。進入orientationChanged方法,因此如果方向變爲顛倒,則沒有任何反應。我也刪除了所有的委託代碼,它仍然可以工作,因此不需要委派來實現它。我還沒有時間去嘗試使用Nick提出的單個UIViewController來工作,但是它在我的列表中。 – Sinead