iOS侧滑手势导致的假死

最近做项目的时候遇到个非常奇怪的情况,点击cell的时候会莫名的假死,将程序进入后台再切回来假死消失,但是还是不能进行操作。遇到这个问题的时候也真是一头雾水,找了很多资料,也试了很多办法,依然不起作用。后台仔细研究出现假死的情况发现每次在点击控制器最左边的时候就会出现假死情况,想了想是否和自带的侧滑手势有关,然后写了测试程序,发现果然是这个手势在作怪。

代码结构

代码结构就很简单了,根控制器是tabBarController,然后是两个navigationController,导航栏控制器根控制器为ChatViewController和ProfileViewController,点击ChatViewController的cell进入ChatMainViewController,然后在ChatMainController重写leftItem,这样的话侧滑手势不可用,但是只要重置侧滑手势代理即可解决

@implementation BZNavigationController

- (void)viewDidLoad{
    [super viewDidLoad];

    self.interactivePopGestureRecognizer.delegate = self;
}

@end

 然后问题就开始出现了,此时点击 ChatViewController的cell最左边,在点击cell就出现了假死情况

之后任何操作都不可用,正是因为ChatViewController响应了侧滑手势,解决办法很简单,可以在导航栏控制器只有一个子控制器的时候将手势设为不可用即可,为了代码的扩展性,可以给控制器绑定一个侧滑手势是否可用的属性即可。

1 给UIViewController添加类目 UIViewController (Ex),增加两个方法

@interface UIViewController (Ex)

- (void)setInteractivePopGestureRecognizerEnable:(BOOL)enable;
- (BOOL)getInteractivePopGestureRecognizerEnable;

@end

  .m实现这两个方法

#import "UIViewController+Ex.h"
#import <objc/runtime.h>

static char interactivePopGestureRecognizerEnableKey;

@implementation UIViewController (Ex)

- (void)setInteractivePopGestureRecognizerEnable:(BOOL)enable{
    NSNumber *value = [NSNumber numberWithBool:enable];
    objc_setAssociatedObject(self, &interactivePopGestureRecognizerEnableKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)getInteractivePopGestureRecognizerEnable{
    NSNumber *value = objc_getAssociatedObject(self, &interactivePopGestureRecognizerEnableKey);
    return [value boolValue];
}

@end

2 在每个控制器设定侧滑手势是否可用

3 实现 UINavigationControllerDelegate代理方法

@implementation BZNavigationController

- (void)viewDidLoad{
    [super viewDidLoad];

    self.interactivePopGestureRecognizer.delegate = self;

    self.delegate = self;
}

#pragma mark - navi delegate
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    BOOL enable = [viewController getInteractivePopGestureRecognizerEnable];
    self.interactivePopGestureRecognizer.enabled = enable;
}

@end

 这样即可为每个控制器自定义是否可以相应侧滑手势了!

时间: 2024-10-09 10:16:08

iOS侧滑手势导致的假死的相关文章

TCP连接的TIME_WAIT过多导致 Tomcat 假死

最近发现使用的Tomcat 7会经常假死.前端点击页面无任何反应,打开firebug,很多链接一直在等待服务器的反应.查看服务器的状态,CPU占用很少,最多不超过10%,一般只有2%,3%左右,内存占用倒是接近80, 90%.一开始怀疑是tomcat内存配置不够,但是打开 jvisualvm.exe 分析,发现Tomcat 占用的堆内存没有什么问题.因为是假死,所以最后怀疑到 tomcat的 链接数和 数据库的链接数的配置估计太小了.netstat -na 结果页显示很多time_wait. 查

jQuery Ajax同步参数导致浏览器假死怎么办

俗话说不作死就不会死,今天作死了一回,写了一个比较二逼的函数,遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData的函数,它接收不同参数,只负责获取数据,然后把数据return.基本的逻辑剥离出来是这样的:  代码如下 复制代码 function getData1(){        var result;        $.ajax({            url : 'p.

win10下使用搜狗浏览器切换输入法导致浏览器假死解决方法

打开搜狗安装目录,例如E:\SogouExplorer\6.0.5.17804\wkdlls\PepperFlash  找到pepflashplayer.dll这个文件将其重命名即可.

使用publisher模式控制频繁的UI输出,避免Winform界面假死

http://www.cnblogs.com/Charltsing/p/publisher.html 最近测试task并发任务的效率与线程池的区别,发现了另外一个问题.task建立任务的速度很快,输出到UI的信息过频,导致UI假死. private void TestMakeTasks(object obj) { string msg = ""; //循环创建task for (int i = 0; i < 3000; i++) { //主线程(winform)--子线程(Thr

tomcat 假死

1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照.1.2编写背景最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发现日志停止没有任何最新的访问日志.连tomcat下面的catalina.log也没有任何访问记录,基本断定该台tomcat已不能提供服务.2 分

分析java进程假死状况

摘自: http://www.myexception.cn/internet/2044496.html 分析java进程假死情况 1 引言 1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发

tomcat 假死现象(转)

1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发现日志停止没有任何最新的访问日志.连tomcat下面的catalina.log也没有任何访问记录,基本断定该台tomcat已不能提供服务.

.net 同步方法调用异步方法假死

最近使用.net core 开发了一个项目,具体就不说了跟项目本身无关.先上一段代码 //示例代码 //前端调用方法 public string GetName() { return GetUserName().Result; } //服务端实现 public async Task<string> GetUserName() { var userModel=await GetUserModel(); return userModel.Name; } public async Task<U

ios开发笔记----exc_bad_access(code=1, address=0x789870)野指针错误,假死debug状态

错误原因: exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后.再去通过该对象去调用其它的方法就会出现野指针错误. 例如: Person *jerry = [[Person alloc]init];  //  retainCount引用计数为1 [jerry eat];  //  调用吃的方法 [jerry release];  //  释放jerry这个对象到 retain