各位大神好!在下正在弄IOS端一个项目,以下问题我调试了好久了,一直无功而返。还望解惑,谢谢谢谢!
问题场景:
在tabBarView中一个放置了三个功能view,三个其中一个view是用来做列表的,列表我是使用tableView来实现。
现在想在这个tableView的cell上添加弹出的menu菜单,长按触发显示这个菜单。我也试过直接在tableView添加长按事件但是效果是一样的。
问题现象:
一开始在此tableView中长按是能长按显示menu的,而且点击tableView中某一项进而跳转到别的view再从别的view返回都是正常的。唯一有问题的地方通过tabBarView切换到另外一个tab,然后再切换回来长按后就不能显示menu了。
调试的一些发现:
调试时发现如果界面刚显示而未去长按时,此处单步调试能进来,就能看到menu
一些关键代码:
//长按的响应函数:
-(void)display:(UILongPressGestureRecognizer *)longPre{
if (longPre.state ==UIGestureRecognizerStateBegan) {
UITableViewCell *cell = (UITableViewCell *)longPre.view;
[cell becomeFirstResponder];
//将选中的设备别名和设备ID名都放到app的传输器缓存里面
//根据cell的内容来设置全局变量
appDelegate.selectEditDevNickname = cell.textLabel.text;
//根据cell的内容来设置全局变量
appDelegate.selectEditDevname = cell.detailTextLabel.text;
UIMenuItem * item1 = [[UIMenuItem alloc]initWithTitle:@"编辑" action:@selector(gotoEditDevView:)];
UIMenuItem * item2 = [[UIMenuItem alloc]initWithTitle:@"删除" action:@selector(delDev:)];
UIMenuController * menu = [UIMenuController sharedMenuController];
[menu setMenuItems:@[item1,item2]];
[menu setTargetRect:cell.frame inView:self.view];
[menu setMenuVisible:YES animated:YES];
// [cell bringSubviewToFront:menu];
}
}
//直接在tableView的cell上添加长按事件
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
///<1.>设置标识符
static NSString * str = @"cellStr";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:str];
UILabel * label = nil;
//获取当前的行号
NSUInteger rowNo = indexPath.row;
if([m_devArrM count] <= 0){
return cell;
}
Device *dev = [m_devArrM objectAtIndex:rowNo];
///<3.>新建cell
if (cell == nil) {
//创建一个cell
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:str];
//添加长按事件
if (cell.gestureRecognizers.count ==0) {
UILongPressGestureRecognizer* longPre = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(display:)];
[cell addGestureRecognizer:longPre];
}
//单元格设为圆角
cell.layer.cornerRadius = 8;
cell.layer.masksToBounds = NO;
//cell.textLabel.text = [self.arrayDS objectAtIndex:rowNo];
//cell.detailTextLabel.text = @"lcz061403";
label = [[UILabel alloc]initWithFrame:CGRectMake(SCREEN_WIDTH_V-80, 0, 80, 50)];
label.textAlignment = NSTextAlignmentCenter;
[cell addSubview:label];
//在屏幕滚动时,只显示图像
cell.layer.shouldRasterize = YES;
//栅格化,必须指定分辨率,否则默认使用 * 1,生成图像!
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
}
//主标题样式
cell.textLabel.text = dev.name;
cell.textLabel.font = [UIFont systemFontOfSize:10];
//副标题样式
cell.detailTextLabel.text = dev.passwd;
cell.detailTextLabel.font = [UIFont systemFontOfSize:8];
return cell;
}
//两个界面退出和进来的代理
- (void)viewWillAppear:(BOOL)animated{
m_devArrM = [Device allDeviceFromDB:sRenderUserName];
[self.tableView reloadData];
return;
}
- (void)viewWillDisappear:(BOOL)animated{
self.tabBarItem.image = [UIImage imageNamed:@"tab_dev_normal.png"]; //显示选中图片
}
//是否可以成为第一响应
-(BOOL)canBecomeFirstResponder{
NSLog(@"method: %s ",__func__);
return YES;
}