怎样多次导航之后webview 返回键之前的view

给单独的viewcontroller或者在Appdelegate的主页面添加导航条,只要在viewcontroller上添加navigationcontroller,在添加此navigationcontroller即可
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
& & self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
& & ViewController *mainView = [[ViewController alloc]init];
& & UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:mainView];
& & navi.navigationBar.backgroundColor = [UIColor blueColor];
& & [self.window setRootViewController:navi];
& & [self.window makeKeyAndVisible];
& & return YES;
导航条的字体和颜色的设置
self.navigationController.navigationBar.titleTextAttributes
=& [NSDictionary dictionaryWithObject:[UIColor whiteColor]
forKey:UITextAttributeTextColor]; // --- 字体颜色
& & [self.navigationController.navigationBar&setBackgroundImage:[UIImage&imageNamed:@"BJ.png"] forBarMetrics:UIBarMetricsDefault]; //&&&背景色
导航条跳转页面的考虑
对于用navigationcontroller来跳转页面的时候,其实是执行堆栈的进栈和出栈的操作,要想释放内存,那么在来回跳转的时候,就要考虑几个问题了
1 A =&B=&C=&D,D=&A 有根视图的话 (HOME)[self.navigationController popToRootViewControllerAnimated:YES];& D=&C& (每一个界面返回上一层)[self.navigationController popViewControllerAnimated:YES];& 返回到上一层,并且传递参数CViewController *cvc = [CViewController alloc]init];cvc.str = self.[self.navigationController popToViewController:cvc animated:true];返回到上一层后,上一页面显示后要接收参数,并刷新。注意此时应该在viewDidAppear中进行判断并接收传递的值-(void)viewDidAppear:(BOOL)animated{& //判断并接收返回的参数}
2&&A =&B=&C=&D=&E,E=&B=&C=&E
因为B在之前已经出现过,不能在E中直接PUSH到B,因为那样已经是两个B了,增加内存,所以在跳转的时候,就要进行判断是否之前已经出现过B了,出现过,则直接push。这样push到的是原有的B,不会在内存中重新生成一个B了。
&NSArray *array = self.navigationController.viewC
& & for (UIViewController *vc in array) {
& & & & if ([vc isKindOfClass:[BXXXViewController class]]) {
或者知道每个界面的指针
[self.navigationController
popToViewController: [self.navigationController.viewControllers
&&&&&&&& objectAtIndex: ([self.navigationController.viewControllers count] -4)]
&&&&&&&&&&&&&&& animated:YES];
在使用时,根据自己返回层的需要,只要改变一下&-4&这个数字就可以达到目的了
阅读(...) 评论()导航控制器的侧滑返回与全屏滑动返回功能 - 简书
导航控制器的侧滑返回与全屏滑动返回功能
侧滑返回做法1:
前提条件:采用系统默认的返回按钮弊端:必须从屏幕左侧的边缘滑动才会实现侧滑返回功能
// 直接调用系统的push方法,无需我们写pop时的代码
[self.navigationController pushViewController:vc1 animated:NO];
101.131.gif
侧滑返回做法2:
前提条件:自定义导航栏返回按钮弊端:必须从屏幕左侧的边缘滑动才会实现侧滑返回功能
代码:自定义导航栏返回按钮
#import "ZBNavController.h"
@interface ZBNavController ()&UINavigationControllerDelegate&
@property (nonatomic ,strong) id PopVCD
@implementation ZBNavController
#warning 程序初始运行先执行pushViewController,方法执行完毕,才真真正正激情根控制器添加到屏幕上。然后加到屏幕时候,立刻调用navigationController,整个过程一气呵成.
- (void)viewDidLoad {
[super viewDidLoad];
// 导航控制器成为自己的代理。【必不可少,已验证】
// 既然任何类的对象都能成为导航控制器的代理,那么自己成为导航控制器的代理,有何不可呢?再者:成为代理,必须得遵守协议,设置代理对象是谁,实现代理方法,这三大核心步骤缺一不可。
self.delegate =
// 将要push到某个控制器的时候调用。参数viewController表示要push的控制器
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (self.childViewControllers.count != 0) {
NSLog(@"非根控制器");
//加载图片
UIImage *image = [[UIImage imageNamed:@"NavBack"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// 自定义导航栏的返回按钮
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:image style:0 target:self action:@selector(back)];
//只要重写了pushViewController方法,里面一定要有这行代码,否则就不能实现控制器之间的跳转(入栈和出栈)
[super pushViewController:viewController animated:animated];
- (void)back {
// 返回上一级
[self popViewControllerAnimated:YES];
// 代理方法:导航控制器的View显示完毕时调用。 参数viewController要显示的控制器
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
//判断当前显示的控制器是否为根控制器.
if(self.childViewControllers.count == 1) {
//是根控制器,设回手势代理。否则侧滑没反应,所以也就无法pop到上一级控制器。[已验证]
self.interactivePopGestureRecognizer.delegate = self.PopVCD
101.132.gif
全屏滑动返回
#import "ZBNavController.h"
@interface ZBNavController ()&UIGestureRecognizerDelegate&
@implementation ZBNavController
- (void)viewDidLoad {
[super viewDidLoad];
// 滑动的手势
// 只要我们触发滑动的手势(滑动屏幕),系统就会调用self.interactivePopGestureRecognizer.delegate的handleNavigationTransition:方法,实现全屏返回功能。
// 系统底层帮我们实现了handleNavigationTransition:方法,我们只需要调用即可。
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
// 让当前控制器成为滑动手势的代理
pan.delegate =
[self.view addGestureRecognizer:pan];//给窗口的根控制器的view添加手势
//代理方法。判断是否开始响应手势,返回类型为BOOL.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {// C
//当前控制器是否为根控制器
if(self.childViewControllers.count == 1) {// 根控制器
return NO;// 拖动屏幕没有反应,即不会发生返回
}else {// 非根控制器
return YES;// 拖动屏幕有反应,即会发生返回
101.130.gif
拓展:自定义导航栏背景颜色,导航栏字体颜色,字体大小
#import "ZBNavController.h"
@interface ZBNavController ()
@implementation ZBNavController
- (void)viewDidLoad {
[super viewDidLoad];
// 某个类或者子类重写了系统的initialize方法,只有在用这个类创建出对象的情况下,才会调用initialize方法,可能调用过多次
+ (void)initialize {
if (self == [ZBNavController class]) {
//获取整个应用程序下所有的导航条.
//UINavigationBar *bar = [UINavigationBar appearance];
//获取指定类下面的导航条
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[ZBNavController class]]];
//导航条的背景图片
[bar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// 导航栏的字体颜色
//根据可变字典中的key(即NSForegroundColorAttributeName),取出value,即使右边的[UIColor whiteColor]
dict[NSForegroundColorAttributeName] = [UIColor whiteColor];
// 导航栏的字体大小
dict[NSFontAttributeName] = [UIFont boldSystemFontOfSize:20];
[bar setTitleTextAttributes:dict];
101.132.gif
出现的问题1:pop控制器的时候,有竖直的黑影
101.128.gif
解决办法:给黑影所在的控制器设置背景颜色。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
101.129.gif
独立的导航控制器NavigationBar之间切换效果
实现的效果:pop时二级界面的导航栏不会消失隐藏.
系统默认切换效果(共用一个导航条)
101.140.gif
自定义切换效果(两个独立的导航条)
101.134.gif
显示/隐藏navigationBar
在要push的控制器的viewWillAppear方法中设置navigationBar的隐藏或者显示// 在viewWillAppear实现显示/隐藏navigationBar
-(void)viewWillAppear:(BOOL)animated{
self.navigationController.navigationBar.hidden = YES;
101.136.gif
爱钻研,爱总结,爱分享。16855人阅读
1.从视图A中navigation controller push到视图B,当视图B navigationcontroller pop回到视图A时,并不会调用A的viewDidLoad,但是会调用viewWillAppear,所以如果视图A有需要变更的内容应该在viewWillAppear中实现。
2.当一个视图生成时是先调用viewDidLoad,再调用viewWillAppear的。
3.如果视图刷新时,其中的内容没有改变,要考虑内容的数据源是否被变更了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:686254次
积分:5740
积分:5740
排名:第4450名
原创:142篇
转载:38篇
评论:59条
(1)(2)(2)(2)(1)(2)(3)(4)(8)(10)(24)(9)(4)(4)(6)(5)(7)(8)(3)(2)(2)(4)(1)(4)(18)(10)(1)(1)(4)(1)(1)(1)(1)(1)(12)(2)(1)(8)问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
如题 遮盖掉一般我能想到的只有3中方式
直接用一个全屏view加到window上面。
模态出一个controller。
当前controller addChildViewController也可以。
但是这些都无法满足滑动返回,因为都不是加在当前的view上所以无法在当前视图实现滑动返回,有没有人知道这种该如何实现?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我已经解决了 就统一在这里说吧 你可以先viewWillAppear这里面设置导航栏的透明度为0 viewWillDisappear在这里面设置为1 那个view高宽为全屏就可以解决
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
隐藏navigationBar就好了
在viewWillAppear里调用
[self.navigationController setNavigationBarHidden:YES animated:YES];
但这个时候滑动返回有问题在viewDidLoad里调用
self.navigationController.interactivePopGestureRecognizer.delegate = (id&UIGestureRecognizerDelegate&)
返回按钮自己添加一个就好了
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:}

我要回帖

更多关于 wkwebview 返回上一级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信