1

最近、テーブル セル内の UILabel を長押しして「コピー」メニューを表示し、ユーザーがテキストをペーストボードにコピーできるようにする機能をアプリに追加しました。シミュレーターでも、デバイスに直接ビルドする場合でも、うまく機能します。ただし、(TestFlight にプッシュできるように) ビルドしてアーカイブすると、機能が動作しません。

このスタック オーバーフローの質問で解決策を試みましたが、うまくいきませんでした (iOS 5.0 以降用にビルドしているため、関連性がないようです)。ビルド設定で最適化レベルを設定しています。None [-O0]

  1. Xcode で正常に動作する場合、何が失敗しているのかをデバッグするにはどうすればよいですか? (IE、Gesture Recognizer が機能していない、または UIMenuController など)
  2. アーカイブ コピーの動作がビルド ツー デバイス コピーと異なるのはなぜですか?

関連するコードは次のとおりです (ただし、問題はこのコードではなく、Xcode の設定にあると 90% 確信しています)。

Gesture Recognizer の追加:

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 に答える