1

我最近在我的应用程序中添加了长按表格单元格内的 UILabel 以使“复制”菜单出现的功能,以便用户可以将文本复制到粘贴板。它在模拟器中和直接构建到设备时都很好用。但是,当我构建和存档(以便我可以推送到 TestFlight)时,该功能不起作用。

我尝试了这个 Stack Overflow question中的解决方案,但它没有用(而且似乎不相关,因为我正在为 iOS 5.0+ 构建)。我在构建设置中设置了优化级别。None [-O0]

  1. 如果它在 Xcode 中运行良好,我该如何调试失败的地方?(IE,是手势识别器不工作,还是 UIMenuController 等)
  2. 为什么存档副本的行为与构建到设备的副本不同?

这是相关代码(尽管我 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:) );
}

正如我所说,它对设备和模拟器的构建效果很好,而不是在构建和存档之后。

4

1 回答 1

1

NSAssert在发布版本中未调用该方法,因为该-DNS_BLOCK_ASSERTIONS标志已为发布版本启用。

在上面的代码中,我通过移动[self becomeFirstResponder]到它自己的行来解决这个问题,将返回值分配给一个 BOOL,然后在 BOOL 上调用 NSAssert。

于 2012-12-19T01:03:06.483 回答