IOS开发-OC UINavigationController使用
<h2>1.什么是UINavigationController</h2><p>UINavigationController是iOS中的一个重要的导航控制器类,它可以用来管理页面之间的导航跳转。</p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">UINavigationController的主要特征包括:</span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">- 管理导航栈(navigation stack),实现页面的推入和弹出。<br>- 包含一个navigation bar,显示导航项和标题。<br>- 可以通过push和pop方法来进行页面跳转。<br>- 新页面是被push到栈顶,返回则通过pop返回。<br>- 支持自定义navigation bar的样式。<br>- 支持手势返回功能。</span></span></p>
<h2><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">2.使用UINavigationController的基本流程:</span></span></span></h2>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">1. 创建UINavigationController,初始化时指定根视图控制器。</span></span></span></span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">2. 将UINavigationController设置为window的rootViewController。</span></span></span></span></span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">3. 通过pushViewController方法进行页面跳转。</span></span></span></span></span></span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">4. 通过popViewController方法返回上一页。</span></span></span></span></span></span></span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">5. 通过设置navigationBar的属性来自定义样式。</span></span></span></span></span></span></span></span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">6. 子页面通过navigationItem属性设置导航栏内容。</span></span></span></span></span></span></span></span></span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">UINavigationController是iOS中最常用的页面导航方案,可以方便地实现页面进出栈的管理,是开发iOS App必学的一个重要类。掌握使用UINavigationController可以轻松实现iOS App的多页面导航功能。<span class="c-message__edited_label" dir="ltr" data-sk="tooltip_parent"><br></span></span></span></span></span></span></span></span></span></span></span></p>
<h2><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">3.具体实现:</span></span></span></span></span></span></span></span></span></span></h2>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">1.创建UINavigationController,初始化时指定根视图控制器。</span></span></span></span></span></span></span></span></span></span></p>
<p><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break"><span class="c-mrkdwn__br" data-stringify-type="paragraph-break">这一步一般是在AppDelegate文件的application钩子中完成</span></span></span></span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建ui navigation控制器
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">UINavigationController和tabbercontroller一样本身没有视图和逻辑,所以需要设置一个根视图,这里将opeview页面设置为根视图</span>
UINavigationController *navigationController=<span style="color: rgba(0, 0, 0, 1)">[initWithRootViewController:networklisten];
;</span></pre>
</div>
<p>2. 将UINavigationController设置为window的rootViewController。</p>
<p>这一步同样在AppDelegate文件的application钩子中完成,先定义window对象</p>
<p>在AppDelegate的头文件中定义</p>
<div class="cnblogs_code">
<pre>@property (strong,nonatomic)UIWindow *window;</pre>
</div>
<p>然后将window的rootViewController设置为UINavigationController,并执行window的makeKyeAndVisible方法</p>
<div class="cnblogs_code">
<pre> self.window.rootViewController = navigationController;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将根视图控制室设置为UINavigationController</span>
;</pre>
</div>
<p> </p>
<p> 3. 通过pushViewController方法进行页面跳转。</p>
<div class="cnblogs_code">
<pre>;</pre>
</div>
<p>这里有一个很重要的细节:</p>
<p><span style="background-color: rgba(255, 255, 255, 1); color: rgba(255, 0, 0, 1)">如果要从A页面跳到B页面首先要确保A页面已经在UINavigationController里面,否则通过self.navigationController获取的就不是UINavigationController的实例而是nil,其次是确保B页面不在UINavigationController里面。</span></p>
<p><span style="background-color: rgba(255, 255, 255, 1); color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">4. 通过popViewController方法返回上一页。</span><br></span></p>
<div class="cnblogs_code">
<pre>-(<span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)">)back{
;
}</span></pre>
</div>
<p>5. 通过设置navigationBar的属性来自定义样式。6. 子页面通过navigationItem属性设置导航栏内容。</p>
<p>这个的实现方法有很多,我一般是在viewWillAppear钩子里直接隐藏掉系统的navigationBar,然后自定义一个。</p>
<div class="cnblogs_Highlighter">
<pre class="brush:objc;gutter:true;">-(void) viewWillAppear:(BOOL)animated{
self.navigationController.navigationBarHidden = YES;
;
}
</pre>
</div>
<p> </p>
<div class="cnblogs_code">
<pre>-(<span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)">)initbar{
_barview </span>= [ initWithFrame:CGRectMake(<span style="color: rgba(128, 0, 128, 1)">0.0</span>,<span style="color: rgba(128, 0, 128, 1)">0.0</span>,self.view.frame.size.width,<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">)];
_barview.backgroundColor </span>= ;
;
_goback </span>= [ initWithFrame:CGRectMake(<span style="color: rgba(128, 0, 128, 1)">20</span>, <span style="color: rgba(128, 0, 128, 1)">65</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>, <span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)">)];
forState:UIControlStateNormal];
;
_goback.userInteractionEnabled</span>=<span style="color: rgba(0, 0, 0, 1)">YES;
UITapGestureRecognizer </span>*backGesture =[ initWithTarget:self action:@selector(back)];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建手势</span>
<span style="color: rgba(0, 0, 0, 1)"> ;
_tit </span>=[ initWithFrame:CGRectMake((self.view.frame.size.width-<span style="color: rgba(128, 0, 128, 1)">80</span>)/<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">63</span>, <span style="color: rgba(128, 0, 128, 1)">80</span>, <span style="color: rgba(128, 0, 128, 1)">19</span><span style="color: rgba(0, 0, 0, 1)">)];
_tit.text</span>=<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">添加家庭</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
_tit.font</span>=;
_tit.textAlignment </span>=<span style="color: rgba(0, 0, 0, 1)"> NSTextAlignmentCenter;
;</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p> </p>
<h2>这里再教大家如何从一个页面直接返回一个指定的页面并传递参数</h2>
<p>如:我现在要返回tabbar中的location页面并携带参数wearid</p>
<p>1.定义一个可变数组marr来存放当前所有的页面栈,通过self.navigationController.viewControllers来获取</p>
<p>2.遍历marr数组,通过isKindOfClass方法来判断是否是自己要跳过去的页面栈</p>
<p>3.如果找到了用对应的页面类型来接收一下marr,这里我要跳转的定位页面在tabbar的第一个bar所以我先用setSelectedIndex方法来设置它选择的tabbar为第一个,然后再用UITabBarController类型来接受它,这样才能通过selectedViewController属性来获取到激活的页面也就是location页面,再用location页面接收获取到的激活的页面,再写入要传递参数;最后</p>
<p>调用popToViewController方法跳转过去即可。</p>
<pre><span>setSelectedIndex</span></pre>
<div class="cnblogs_code">
<pre>NSMutableArray *marr =<span style="color: rgba(0, 0, 0, 1)"> [initWithArray:self.navigationController.viewControllers];</span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span> i=<span style="color: rgba(128, 0, 128, 1)">0</span>;i<marr.count;i++<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>( isKindOfClass:]){
setSelectedIndex:</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
UITabBarController </span>*bar =<span style="color: rgba(0, 0, 0, 1)">marr;
location </span>* loc =<span style="color: rgba(0, 0, 0, 1)">bar.selectedViewController;
[</span><span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">wearerId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]];
self.navigationController.navigationBarHidden </span>=<span style="color: rgba(0, 0, 0, 1)"> YES;
animated:YES];
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
}
}
</span></pre>
</div>
<h2> </h2>
<h2>再教大家如何从页面栈中移除指定的页面 </h2>
<p>1.获取所有页面栈</p>
<p>2.遍历可变数组,移除要移除的页面栈</p>
<p>3.将self.navigationController.viewControllers设置为完成移除操作之后的可变数组marr</p>
<div class="cnblogs_code">
<pre>NSMutableArray *marr =<span style="color: rgba(0, 0, 0, 1)"> [initWithArray:self.navigationController.viewControllers];
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (UIViewController *vc <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> marr) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (]) {
;
</span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
}
}
self.navigationController.viewControllers </span>=<span style="color: rgba(0, 0, 0, 1)"> marr;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">也可以直接根据下标移除</span>
;</pre>
</div>
<h2>如何返回根视图(第一个页面)</h2>
<div class="cnblogs_code">
<pre>;</pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/SadicZhou/p/17559344.html
頁:
[1]