我最近在我的应用程序中添加了长按表格单元格内的UILabel以显示“复制”菜单的功能,以便用户可以将文本复制到粘贴板。它在模拟器和我直接构建到设备时都很好用。但是,当我建立&存档(所以我可以推送到TestFlight)该功能不起作用。
我尝试了this Stack Overflow question中的解决方案,但它没有用(因为我正在为iOS 5.0+构建,所以似乎并不相关)。我在构建设置中将优化级别设置为None [-O0]
。
这是相关的代码(虽然我90%确定问题不是这个代码,而是一些Xcode设置):
添加手势识别器:
UIGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPressForCopy:)];
[_postLabel addGestureRecognizer:longPress];
[self addSubview:_postLabel];
处理长按
- (void)handleLongPressForCopy:(UILongPressGestureRecognizer *)recognizer {
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
NSAssert([self becomeFirstResponder], @"Sorry, UIMenuController will not work with %@ since it cannot become first responder", self);
UIMenuController *theMenu = [UIMenuController sharedMenuController];
CGRect displayRect = CGRectMake(_postLabel.frame.origin.x, _postLabel.frame.origin.y, 10, 0);
[theMenu setTargetRect:displayRect inView:self];
[theMenu setMenuVisible:YES animated:YES];
break;
default:
break;
}
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return (action == @selector(copy:) );
}
正如我所说的那样,它对设备和模拟器的构建非常有效,而不是在Build&档案
答案 0 :(得分:1)
在发布版本中未调用NSAssert
方法,因为已为发布版本启用了-DNS_BLOCK_ASSERTIONS
标记。
在上面的代码中,我通过将[self becomeFirstResponder]
移动到它自己的行,将返回值赋给BOOL,然后在BOOL上调用NSAssert来解决了这个问题。