<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>导航控制器 on 编程技术记录</title>
    <link>https://blog.z6z8.cn/tags/%E5%AF%BC%E8%88%AA%E6%8E%A7%E5%88%B6%E5%99%A8/</link>
    <description>Recent content in 导航控制器 on 编程技术记录</description>
    <generator>Hugo</generator>
    <language>zh-Hans</language>
    <lastBuildDate>Thu, 17 Oct 2019 05:14:26 +0000</lastBuildDate>
    <atom:link href="https://blog.z6z8.cn/tags/%E5%AF%BC%E8%88%AA%E6%8E%A7%E5%88%B6%E5%99%A8/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>iOS13适配：UIWindow窗口和导航控制器</title>
      <link>https://blog.z6z8.cn/2019/10/17/ios13%E9%80%82%E9%85%8D%EF%BC%9Auiwindow%E7%AA%97%E5%8F%A3%E5%92%8C%E5%AF%BC%E8%88%AA%E6%8E%A7%E5%88%B6%E5%99%A8/</link>
      <pubDate>Thu, 17 Oct 2019 05:14:26 +0000</pubDate>
       <guid isPermaLink="false">http://blog.z6z8.cn/?p=512</guid> 
      <description>&lt;p&gt;@
这次iOS13的发布，其改动步子有点大了，尤其是是其多场景窗口（多任务）已经颠覆了老应用的设计基础了&amp;mdash;-数据的协同共享处理机制（本文不谈，哈哈）
这里记录下一些界面层面的适配体会：&lt;/p&gt;
&lt;p&gt;如果是 &lt;code&gt;Xcode 10&lt;/code&gt; 及以下创建的老项目，用 &lt;code&gt;Xcode 11&lt;/code&gt; 打开，老项目基本能正常运行。但是如果用 &lt;code&gt;Xcode 11&lt;/code&gt; 创建新项目，还按照老项目思路写代码就会有坑了。&lt;/p&gt;
&lt;p&gt;用 &lt;code&gt;Xcode 11&lt;/code&gt; 创建一个 &lt;code&gt;Single View App&lt;/code&gt; 项目，会多生成一些文件和代码&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多了SceneDelegate代理&lt;/li&gt;
&lt;li&gt;Info.plist里面多了Application Scene Manifest配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多出来的这些文件和代码，影响最直观的是多场景窗口和导航控制器。&lt;/p&gt;
&lt;h1 id=&#34;适配方案不支持多场景窗口&#34;&gt;适配方案——不支持多场景窗口&lt;/h1&gt;
&lt;p&gt;这种适配方案最简单。
将多出来的文件和代码删除就好了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除SceneDelegate代理文件 (可选)&lt;/li&gt;
&lt;li&gt;删除 Info.plist里面的Application Scene Manifest配置（一定要删除）&lt;/li&gt;
&lt;li&gt;删除 AppDelegate代理的两个方法：
&lt;code&gt;application:configurationForConnectingSceneSession:options:&lt;/code&gt; &lt;code&gt;application: didDiscardSceneSessions:&lt;/code&gt;
这两个方法一定要删除，否则使用纯代码创建的 &lt;code&gt;Window&lt;/code&gt; 和导航控制器 &lt;code&gt;UINavigationController&lt;/code&gt; 不会生效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;适配方案支持多场景窗口&#34;&gt;适配方案——支持多场景窗口&lt;/h1&gt;
&lt;p&gt;先说我遇到的一些现象。
尽管我不会为每个应用自定义窗口和导航，但我我依然会使用纯代码创建 &lt;code&gt;UIWindow&lt;/code&gt; 和 &lt;code&gt;UINavigationController&lt;/code&gt;，具体如下&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-objectivec&#34; data-lang=&#34;objectivec&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//AppDelegate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;- (&lt;span style=&#34;color:#66d9ef&#34;&gt;BOOL&lt;/span&gt;)&lt;span style=&#34;color:#a6e22e&#34;&gt;application:&lt;/span&gt;(UIApplication &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)application &lt;span style=&#34;color:#a6e22e&#34;&gt;didFinishLaunchingWithOptions:&lt;/span&gt;(NSDictionary &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)launchOptions {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//在Xcode11创建的项目中，需要自行给AppDelegate添加属性window
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//自定义Window
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    self.window &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//自定义导航控制器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    UINavigationController &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;rootNavgationController &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//导航控制是rootViewController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    self.window.rootViewController &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rootNavgationController;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//现实Window
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    [self.window makeKeyAndVisible];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; YES;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Xcode 11&lt;/code&gt; 创建的项目中，写入上述代码运行App，结果发现这部分代码虽然执行了，但是通过UIViewController的 &lt;code&gt;self.navigationController&lt;/code&gt; 获取的导航竟然是 &lt;code&gt;nil&lt;/code&gt;。
从现象反推过程，既然代码执行了，那么很大可能是 &lt;code&gt;self.window&lt;/code&gt; 没有显示在屏幕上。
查看iOS13下 &lt;code&gt;UIWindow&lt;/code&gt; 的定义，有这么一条&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
