Skip to content

Commit

Permalink
Site updated: 2015-11-02 00:26:11
Browse files Browse the repository at this point in the history
  • Loading branch information
Grayon committed Nov 1, 2015
1 parent 5bed35e commit 9529535
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
<meta property="og:description" content="问题描述在使用UINavigationController时,使用简单的push(现在是show)、pop操作就可以实现页面的层次管理,iOS的导航控制器也提供了很好的动画效果和手势控制,带来了非常优秀的用户体验。
可是UINavigationController是使用栈来管理的,在使用时我们难免会遇到特殊的需求,使用简单的push、pop不能满足,这时候就需要我们自己手动来管理UINavigat">
<meta property="og:image" content="http://laa.pw/uploads/navigationcontroller.gif">
<meta property="og:updated_time" content="2015-11-01T16:23:55.000Z">
<meta property="og:updated_time" content="2015-11-01T16:26:00.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="UINavigationController的viewControllers管理">
<meta name="twitter:description" content="问题描述在使用UINavigationController时,使用简单的push(现在是show)、pop操作就可以实现页面的层次管理,iOS的导航控制器也提供了很好的动画效果和手势控制,带来了非常优秀的用户体验。
Expand Down Expand Up @@ -255,8 +255,7 @@ <h1 class="post-title" itemprop="name headline">
<h1 id="应用实例">应用实例</h1><p>在使用<strong>微信</strong>或者<strong>qq</strong>时,你可能会发现,<strong>微信</strong><strong>NavigationController</strong>的竟然可以在子视图之间随意跳转。</p>
<p>比如打开首页右上角的扫一扫功能,扫描一个网址二维码,可以看到一个push动画进入了一个<strong>WebviewController</strong>,这时候不管你用左上角的返回键还是使用手势滑动返回,你都会发现你直接回到了首页,中间的扫一扫界面去哪了?</p>
<p>还有打开联系人界面,点击查看联系人详情,一切都很正常,可是再联系人详情页面点击发消息,再试试返回键或者返回手势,发现了吗,这看起来好像从一个<strong>NavigationController</strong>的子页面push到了另一个<strong>NavigationController</strong>的子页面,这看起来应该是不能被实现的,<br>这不符合<strong>NavigationController</strong>的页面管理方式。</p>
<p>#研究实现</p>
<p>经过对<strong>微信</strong>的研究,发现原本我对微信的结构理解是错误的,原本认为微信的主界面是使用一个<strong>UITabBarViewController</strong>管理着四个<strong>NavigationController</strong>来实现的,可是现在发现,他应该是使用了一个统一的<strong>NavigationController</strong>管理一个<strong>TabBarViewController</strong>,其下有四个子<strong>ViewController</strong><br>通过监听<strong>selectedIndex</strong>来改变<strong>navigationItem</strong><strong>title</strong>就可以了。</p>
<h1 id="研究实现">研究实现</h1><p>经过对<strong>微信</strong>的研究,发现原本我对微信的结构理解是错误的,原本认为微信的主界面是使用一个<strong>UITabBarViewController</strong>管理着四个<strong>NavigationController</strong>来实现的,可是现在发现,他应该是使用了一个统一的<strong>NavigationController</strong>管理一个<strong>TabBarViewController</strong>,其下有四个子<strong>ViewController</strong><br>通过监听<strong>selectedIndex</strong>来改变<strong>navigationItem</strong><strong>title</strong>就可以了。</p>
<p>通过这样管理就可以在子<strong>ViewController</strong>之间跳转了,可是这样还是不能实现微信的效果,因为从view22 push到view12再返回时view22从导航控制器的栈里消失了。</p>
<p>那我们是不是可以先pop出当前页面再push</p>
<figure class="highlight objectivec"><table><tr><td class="code"><pre><span class="line"><span class="built_in">UIViewController</span> *vc = [[<span class="built_in">UIStoryboard</span> storyboardWithName:<span class="string">@"Main"</span> bundle:[<span class="built_in">NSBundle</span> mainBundle]] instantiateViewControllerWithIdentifier:<span class="string">@"view12"</span>];</span><br><span class="line"> <span class="built_in">UITabBarController</span> *tb = <span class="keyword">self</span><span class="variable">.navigationController</span><span class="variable">.viewControllers</span>[<span class="number">0</span>];<span class="comment">//取得栈中tabBarController</span></span><br><span class="line"> [tb setSelectedIndex:<span class="number">0</span>]; <span class="comment">//改变tabBar的selectedIndex</span></span><br><span class="line"> [<span class="keyword">self</span><span class="variable">.navigationController</span> popToRootViewControllerAnimated:<span class="literal">NO</span>];</span><br><span class="line"> [<span class="keyword">self</span> showViewController:vc sender:<span class="keyword">self</span>];</span><br></pre></td></tr></table></figure>
Expand Down Expand Up @@ -453,7 +452,7 @@ <h1 id="示例源码">示例源码</h1><p><a href="https://github.com/Grayon/Wec



<div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#问题描述"><span class="nav-number">1.</span> <span class="nav-text">问题描述</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#应用实例"><span class="nav-number">2.</span> <span class="nav-text">应用实例</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#效果演示"><span class="nav-number">3.</span> <span class="nav-text">效果演示</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#示例源码"><span class="nav-number">4.</span> <span class="nav-text">示例源码</span></a></li></ol></div>
<div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#问题描述"><span class="nav-number">1.</span> <span class="nav-text">问题描述</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#应用实例"><span class="nav-number">2.</span> <span class="nav-text">应用实例</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#研究实现"><span class="nav-number">3.</span> <span class="nav-text">研究实现</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#效果演示"><span class="nav-number">4.</span> <span class="nav-text">效果演示</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#示例源码"><span class="nav-number">5.</span> <span class="nav-text">示例源码</span></a></li></ol></div>

</div>
<div class="post-toc-indicator-bottom post-toc-indicator"></div>
Expand Down
7 changes: 3 additions & 4 deletions atom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<subtitle><![CDATA[Nice to meet you]]></subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://laa.pw/"/>
<updated>2015-11-01T16:23:55.000Z</updated>
<updated>2015-11-01T16:26:00.000Z</updated>
<id>http://laa.pw/</id>

<author>
Expand All @@ -19,14 +19,13 @@
<link href="http://laa.pw/2015/11/01/NavigationController-viewControllers-Management.html"/>
<id>http://laa.pw/2015/11/01/NavigationController-viewControllers-Management.html</id>
<published>2015-11-01T12:39:37.000Z</published>
<updated>2015-11-01T16:23:55.000Z</updated>
<updated>2015-11-01T16:26:00.000Z</updated>
<content type="html"><![CDATA[<h1 id="问题描述">问题描述</h1><p>在使用<strong>UINavigationController</strong>时,使用简单的<strong>push</strong>(现在是show)、<strong>pop</strong>操作就可以实现页面的层次管理,iOS的导航控制器也提供了很好的动画效果和手势控制,带来了非常优秀的用户体验。</p>
<p>可是<strong>UINavigationController</strong>是使用栈来管理的,在使用时我们难免会遇到特殊的需求,使用简单的<strong>push</strong>、<strong>pop</strong>不能满足,这时候就需要我们自己手动来管理<strong>UINavigationController</strong>的<strong>viewControllers</strong>了。</p>
<h1 id="应用实例">应用实例</h1><p>在使用<strong>微信</strong>或者<strong>qq</strong>时,你可能会发现,<strong>微信</strong>的<strong>NavigationController</strong>的竟然可以在子视图之间随意跳转。</p>
<p>比如打开首页右上角的扫一扫功能,扫描一个网址二维码,可以看到一个push动画进入了一个<strong>WebviewController</strong>,这时候不管你用左上角的返回键还是使用手势滑动返回,你都会发现你直接回到了首页,中间的扫一扫界面去哪了?</p>
<p>还有打开联系人界面,点击查看联系人详情,一切都很正常,可是再联系人详情页面点击发消息,再试试返回键或者返回手势,发现了吗,这看起来好像从一个<strong>NavigationController</strong>的子页面push到了另一个<strong>NavigationController</strong>的子页面,这看起来应该是不能被实现的,<br>这不符合<strong>NavigationController</strong>的页面管理方式。</p>
<p>#研究实现</p>
<p>经过对<strong>微信</strong>的研究,发现原本我对微信的结构理解是错误的,原本认为微信的主界面是使用一个<strong>UITabBarViewController</strong>管理着四个<strong>NavigationController</strong>来实现的,可是现在发现,他应该是使用了一个统一的<strong>NavigationController</strong>管理一个<strong>TabBarViewController</strong>,其下有四个子<strong>ViewController</strong>。<br>通过监听<strong>selectedIndex</strong>来改变<strong>navigationItem</strong>的<strong>title</strong>就可以了。</p>
<h1 id="研究实现">研究实现</h1><p>经过对<strong>微信</strong>的研究,发现原本我对微信的结构理解是错误的,原本认为微信的主界面是使用一个<strong>UITabBarViewController</strong>管理着四个<strong>NavigationController</strong>来实现的,可是现在发现,他应该是使用了一个统一的<strong>NavigationController</strong>管理一个<strong>TabBarViewController</strong>,其下有四个子<strong>ViewController</strong>。<br>通过监听<strong>selectedIndex</strong>来改变<strong>navigationItem</strong>的<strong>title</strong>就可以了。</p>
<p>通过这样管理就可以在子<strong>ViewController</strong>之间跳转了,可是这样还是不能实现微信的效果,因为从view22 push到view12再返回时view22从导航控制器的栈里消失了。</p>
<p>那我们是不是可以先pop出当前页面再push</p>
<figure class="highlight objectivec"><table><tr><td class="code"><pre><span class="line"><span class="built_in">UIViewController</span> *vc = [[<span class="built_in">UIStoryboard</span> storyboardWithName:<span class="string">@"Main"</span> bundle:[<span class="built_in">NSBundle</span> mainBundle]] instantiateViewControllerWithIdentifier:<span class="string">@"view12"</span>];</span><br><span class="line"> <span class="built_in">UITabBarController</span> *tb = <span class="keyword">self</span><span class="variable">.navigationController</span><span class="variable">.viewControllers</span>[<span class="number">0</span>];<span class="comment">//取得栈中tabBarController</span></span><br><span class="line"> [tb setSelectedIndex:<span class="number">0</span>]; <span class="comment">//改变tabBar的selectedIndex</span></span><br><span class="line"> [<span class="keyword">self</span><span class="variable">.navigationController</span> popToRootViewControllerAnimated:<span class="literal">NO</span>];</span><br><span class="line"> [<span class="keyword">self</span> showViewController:vc sender:<span class="keyword">self</span>];</span><br></pre></td></tr></table></figure>
Expand Down
2 changes: 1 addition & 1 deletion css/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,7 @@ body {
width: 4px;
height: 4px;
border-radius: 50%;
background: #59c3f4;
background: #fff7e5;
}
.sidebar-nav {
margin: 0 0 20px;
Expand Down
3 changes: 1 addition & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,7 @@ <h1 id="问题描述">问题描述</h1><p>在使用<strong>UINavigationControlle
<h1 id="应用实例">应用实例</h1><p>在使用<strong>微信</strong>或者<strong>qq</strong>时,你可能会发现,<strong>微信</strong><strong>NavigationController</strong>的竟然可以在子视图之间随意跳转。</p>
<p>比如打开首页右上角的扫一扫功能,扫描一个网址二维码,可以看到一个push动画进入了一个<strong>WebviewController</strong>,这时候不管你用左上角的返回键还是使用手势滑动返回,你都会发现你直接回到了首页,中间的扫一扫界面去哪了?</p>
<p>还有打开联系人界面,点击查看联系人详情,一切都很正常,可是再联系人详情页面点击发消息,再试试返回键或者返回手势,发现了吗,这看起来好像从一个<strong>NavigationController</strong>的子页面push到了另一个<strong>NavigationController</strong>的子页面,这看起来应该是不能被实现的,<br>这不符合<strong>NavigationController</strong>的页面管理方式。</p>
<p>#研究实现</p>
<p>经过对<strong>微信</strong>的研究,发现原本我对微信的结构理解是错误的,原本认为微信的主界面是使用一个<strong>UITabBarViewController</strong>管理着四个<strong>NavigationController</strong>来实现的,可是现在发现,他应该是使用了一个统一的<strong>NavigationController</strong>管理一个<strong>TabBarViewController</strong>,其下有四个子<strong>ViewController</strong><br>通过监听<strong>selectedIndex</strong>来改变<strong>navigationItem</strong><strong>title</strong>就可以了。</p>
<h1 id="研究实现">研究实现</h1><p>经过对<strong>微信</strong>的研究,发现原本我对微信的结构理解是错误的,原本认为微信的主界面是使用一个<strong>UITabBarViewController</strong>管理着四个<strong>NavigationController</strong>来实现的,可是现在发现,他应该是使用了一个统一的<strong>NavigationController</strong>管理一个<strong>TabBarViewController</strong>,其下有四个子<strong>ViewController</strong><br>通过监听<strong>selectedIndex</strong>来改变<strong>navigationItem</strong><strong>title</strong>就可以了。</p>
<p>通过这样管理就可以在子<strong>ViewController</strong>之间跳转了,可是这样还是不能实现微信的效果,因为从view22 push到view12再返回时view22从导航控制器的栈里消失了。</p>
<p>那我们是不是可以先pop出当前页面再push</p>
<figure class="highlight objectivec"><table><tr><td class="code"><pre><span class="line"><span class="built_in">UIViewController</span> *vc = [[<span class="built_in">UIStoryboard</span> storyboardWithName:<span class="string">@"Main"</span> bundle:[<span class="built_in">NSBundle</span> mainBundle]] instantiateViewControllerWithIdentifier:<span class="string">@"view12"</span>];</span><br><span class="line"> <span class="built_in">UITabBarController</span> *tb = <span class="keyword">self</span><span class="variable">.navigationController</span><span class="variable">.viewControllers</span>[<span class="number">0</span>];<span class="comment">//取得栈中tabBarController</span></span><br><span class="line"> [tb setSelectedIndex:<span class="number">0</span>]; <span class="comment">//改变tabBar的selectedIndex</span></span><br><span class="line"> [<span class="keyword">self</span><span class="variable">.navigationController</span> popToRootViewControllerAnimated:<span class="literal">NO</span>];</span><br><span class="line"> [<span class="keyword">self</span> showViewController:vc sender:<span class="keyword">self</span>];</span><br></pre></td></tr></table></figure>
Expand Down

0 comments on commit 9529535

Please sign in to comment.