iOS 10 中导航控制器出栈入栈连续操作存在的问题

简介: iOS 10 中导航控制器出栈入栈连续操作存在的问题太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商业用途-保持一致”创作公用协议转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、HTML5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。


iOS 10 中导航控制器出栈入栈连续操作存在的问题

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、AndroidHTML5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



[iOS][兼容性]iOS7 pushViewController,popViewControllerAnimated存在的问题

出现如上链接中提到的问题,懒得再描述了。


其给出的解决办法

    dispatch_async(dispatch_get_main_queue(), ^{
        
        [currentViewController PushViewController:viewController animation:animation];
        
    });

实践,这种办法没有效果,倒是利用延时之前解决过 push 同时隐藏 tabbar 时下方闪黑的问题:

    __block UIViewController *weakSelf = self;
    dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC));
    dispatch_after(delayTime, dispatch_get_main_queue(), ^{
        
        [weakSelf performSelectorOnMainThread:@selector(delayPush:) withObject:viewController waitUntilDone:YES];
        
    });
    
    currentController.extendedLayoutIncludesOpaqueBars = NO;
    currentController.navigationController.navigationBar.translucent = NO;
    currentController.edgesForExtendedLayout = UIRectEdgeNone;//UIRectEdgeTop | UIRectEdgeBottom | UIRectEdgeLeft | UIRectEdgeRight;
}


- (void)delayPush:(UIViewController *)controller {
    
    [self pushViewController:controller animated:YES];
}

@end

只不过,我这是在主线程延时执行。

是否把它的 dispatch_async 换成我的 dispatch_after 并指定个延时时间会有效果。


下面列一下我的解决办法。

我是想把前面的 Controller 都静默 pop 掉,然后再 push 一个,这样最后这个 controller 返回时,是首页。

分析 push 与 pop ,最终都是对 UINavigationController 的 viewcontrollers 数组进行管理并配以相应动画,这样的出栈、入栈操作,可以直接对 viewcontrollers 进行。

    UIViewController *mainController = self.navigationController.viewControllers[0];
    NSArray *controllers = [NSArray arrayWithObjects:mainController, controller, nil];
    [self.navigationController setViewControllers:controllers animated:YES];

好了,问题就这样解决了,把所有的变化集中在 viewcontrollers 的变化中,一次性交给 UINavigationController 进处理。


补充:

实践证明,上面的猜测是不可以的

    [self.navigationController popToRootViewControllerAnimated:NO];
    dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC));
    dispatch_after(delayTime, dispatch_get_main_queue(), ^{
        
        [self.navigationController pushViewController:controller animated:YES];
        
    });

还是得用上面重构 viewcontrollers 来调整。



目录
相关文章
|
4月前
|
iOS开发
你知道IOS移动端到操作手势有哪些吗?
你知道IOS移动端到操作手势有哪些吗?
|
iOS开发
iOS 15后设置导航控制器的导航条背景色无效的问题处理
iOS 15后设置导航控制器的导航条背景色无效的问题处理
377 0
|
10月前
|
Android开发 iOS开发 Windows
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
无影ios & Android客户端6.0.0版本发布!移动端触控体验更舒适,用户操作更便捷,一起来看看!
689 0
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
|
12月前
|
存储 调度 开发者
iOS 子控制器
iOS 子控制器
91 0
|
iOS开发
你知道IOS移动端到操作手势有哪些吗?
大家好,我是阿萨。随着移动端设置应用越来越多。大家在移动端设备上的操作手势有哪些呢?今天阿萨给大家梳理下IOS移动端操作的标准手势。快来看下,看完拿自己公司APP练一下手。
189 0
|
iOS开发
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
121 0
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
|
iOS开发
iOS开发 - 使用UISearchController跳转新控制器时搜索框依然出现
iOS开发 - 使用UISearchController跳转新控制器时搜索框依然出现
106 0
|
Web App开发 iOS开发
iOS开发 - 网页拉起app后并执行某些操作
iOS开发 - 网页拉起app后并执行某些操作
173 0
iOS开发 - 网页拉起app后并执行某些操作
|
定位技术 API 开发工具
iOS小技能:应用外导航
术语: 1. 应用外导航:是指以URL跳转的方式(在iOS中就是以URL Scheme的方式),直接跳到对应的地图APP中,直接利用对方的功能来导航。这样的优点,一是接入方便,二是不增加自己APP的开销。 2. 应用内导航:是指使用地图服务提供的SDK(如高德,百度),直接将导航功能嵌入到我们自己的APP内部。 需求:跳转到已经安装的地图 背景:为了减少app内存开支,以URI跳转的方式直接跳转到对应的地图进行导航,让最专业的人做最专业的事。
112 0
iOS小技能:应用外导航
|
iOS开发
IOS调用导航
IOS调用导航
48 0