菜鸟教程小白 发表于 2022-12-12 13:53:54

ios - 方向改变时交换 UIViewControllers 的问题


                                            <p><p>我有一个带有 2 个 ViewController 的单 View 应用程序,用于呈现纵向和横向的不同布局。我已经设置了方向更改通知,并且可以在第一次方向更改时成功显示横向 View 。 </p>

<p>第一个问题:
当我将方向更改回纵向时,不显示纵向 View 。</p>

<p>第二个问题:
当我将方向更改回横向时,横向 View 会显示,但我收到警告:</p>

<p>尝试在其 View 不在窗口层次结构中的 CalculatorViewController 上呈现 CalculatorViewControllerLandscape。</p>

<p>我浏览了苹果文档和几篇有类似问题的帖子,发现答案在于使用委托(delegate),但我无法正确设置委托(delegate)。这是我的尝试:</p>

<p>CalculatorViewControllerLandscape.h</p>

<pre><code>@protocol SecondControllerDelegate &lt;NSObject&gt;

@end
.....
@property(nonatomic, weak) id &lt;SecondControllerDelegate&gt; delegate;
</code></pre>

<p>CalculatorViewController.h</p>

<pre><code>@interface CalculatorViewController : UIViewController &lt;SecondControllerDelegate&gt; {
....
}
@property (strong) CalculatorViewControllerLandscape *landscapeVC;
</code></pre>

<p>CalculatorViewCalculator.m</p>

<pre><code>- (void)awakeFromNib
{
[ beginGeneratingDeviceOrientationNotifications];
[ addObserver:self
                                       selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification   
                                           object:nil];
// register as a delegate
self.navigationController.delegate = (id)self;
}

- (void)orientationChanged:(NSNotification *)notification
{
   UIDeviceOrientation deviceOrientation = .orientation;
      if (UIDeviceOrientationIsLandscape(deviceOrientation) &amp;&amp;
         !isShowingLandscapeView)      
    {
      NSLog(@&#34;Orientation has changed to landscape&#34;);
      // code here to show landscape storyboard
      UIStoryboard *landscapeStoryboard = ;
      UIViewController *landscapeViewController = ;
         ;
         isShowingLandscapeView = YES;
    }   
    else if (UIDeviceOrientationIsPortrait(deviceOrientation) &amp;&amp;            
         isShowingLandscapeView)      
    {
      NSLog(@&#34;Orientation has changed to portrait&#34;);   
    [ dismissViewControllerAnimated:NO completion:nil];
    isShowingLandscapeView = NO;
    }
}
</code></pre>

<p>我已经为此工作了几个小时,并检查了所有类似问题的帖子,但我仍然无法弄清楚。提前感谢您的帮助。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>最佳实践是在单个 <code>UIViewController</code> 中处理旋转事件,而不是使用两个单独的事件。我不熟悉界面生成器,但您可以通过编程方式覆盖 <code>-(void)viewWillLayoutSubviews;</code> 并根据 <code>self.interfaceOrientation</code> 适本地布置您的 View 。我建议你这样做。</p>

<p>但是,在回答您的问题时:</p>

<p>尝试改变</p>

<pre><code>[ dismissViewControllerAnimated:NO completion:nil];
</code></pre>

<p>到</p>

<pre><code>;
</code></pre>

<p>这也可以解决第二个问题,因为旧的横向 ViewController 没有被正确关闭。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 方向改变时交换 UIViewControllers 的问题,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/18501423/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/18501423/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 方向改变时交换 UIViewControllers 的问题