菜鸟教程小白 发表于 2022-12-12 18:36:47

objective-c - iOS 5 在第二次调用 loadView 时不会自动旋转 View


                                            <p><p>当我在横向模式下运行我的应用程序时,第二次加载我的 ViewController 的 View 并调用 <code>loadView</code> 时,iOS 5 不会将 Root ViewController 的 View 从纵向旋转,也不会调用 ViewController 的 willRotate/willAnimateRotation/didRotate 方法。</p>

<p>如前所述,这只发生在 View 被卸载并且 <code>loadView</code> 被第二次调用之后。在我的应用程序中,我有时会在将 ViewController 的 View 设置为 Root ViewController 之前以编程方式卸载它。但是,当 ViewController 的 View 由于内存不足警告而自动卸载时,也会发生这种情况。</p>

<p>这只发生在 iOS 5 上,而不是 iOS 4.x。在 iOS 模拟器中很容易重现,这里是一个可以重现此问题的独立测试应用的链接:</p>

<p> <a href="http://www.mediafire.com/file/7ob5xw5ym02pasx/ViewControllerTest.zip" rel="noreferrer noopener nofollow">http://www.mediafire.com/file/7ob5xw5ym02pasx/ViewControllerTest.zip</a> </p>

<p>要查看问题,只需编译应用程序并使用 iOS 5.0 模拟器以横向模式启动它,然后点击“A”,然后点击“返回”,您会看到旋转没有发生。</p >

<p>有什么想法吗?这与我设置 <code>window.rootViewController</code> 的方式有关吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我调试了一下,4.3 和 5.0 之间好像有变化。在 4.3 UIKit 调用 <code></code>,在 5.0 它调用 <code></code>。所以也许有一些我们看不到的变化......</p>

<p>我建议解决这个问题,<strong>not</strong> 使用 <code></code>(因此 <strong>not</strong> 将 View 设置为 nil),但是而是压倒一切</p>

<pre><code>- (void)viewWillAppear:(BOOL)animated {
    ;

    // do setup stuff here, reset content etc etc.
}
</code></pre>

<p>并在它实际出现在屏幕上之前重置(已经加载的) View 。 </p>

<p>附加信息:</p>

<p>a) 您不需要将 View 设置为零。系统会为您做到这一点。下次访问该 ViewController 的 View 属性时,系统会调用 <code>loadView</code> 重新创建 View :</p>

<blockquote>
<p>If you access this property and its value is currently nil, the view
controller automatically calls the loadView method and returns the
resulting view. The default loadView method attempts to load the view
from the nib file associated with the view controller (if any).</p>
</blockquote>

<p>b) 这一切都归结为 iOS 5 中关于窗口的 <code>rootViewController</code> 属性的行为。在 iOS 5 中,这两者<strong>不</strong>等效:</p>

<pre><code> self.window.rootViewController = newController;
</code></pre>

<p>对</p>

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

<p>前者完全忽略方向,后者没有。</p>

<p>为了让事情变得更复杂,如果一个人<strong>不覆盖</strong> <code>loadView</code>,而是让系统自动创建一个空的UIView并且只在<code中修改那个 View >viewDidLoad</code>,内存警告不会自动将 View 设置为 nil 并释放它 - 文档:</p>

<blockquote>
<pre><code>The default implementation releases the view only if it determines that it is safe to do so.
</code></pre>
</blockquote>

<p>魔法。取决于是否覆盖该方法。我真的无法以任何方式对此进行测试。</p>

<p>案例 1 - 覆盖 <code>loadView</code>:<br/>
触发内存警告调用 <code>didReceiveMemoryWarning</code> 和 <code>viewDidUnload</code></p>

<p>案例 2 - 没有 <code>loadView</code>:<br/>
在模拟器中触发内存警告<strong>only</strong>调用<code>didReceiveMemoryWarning</code>,而不是<code>viewDidUnload</code></p>

<p>我会说,手动添加 View ...</p>

<p>干杯。</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - iOS 5 在第二次调用 loadView 时不会自动旋转 View ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/8568209/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/8568209/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - iOS 5 在第二次调用 loadView 时不会自动旋转 View