3

アプリの開発中に、誰かが私にバグレポートを提出しました - 「長いテキストをテキストフィールドに貼り付けられません」. 案の定、「貼り付け」バブルがタップから青色のままでハングし、何も起こりません。少し試してみたところ、約 60,000 文字のファイルですべてが機能することがわかりました (心配するほど長い時間はかかりませんでした)。

さらに実験したところ、「メモ」アプリだけでなく、いくつかのサードパーティアプリも同じ動作をすることがわかりました。

これが UITextView (iOS6) の実際の問題である場合、巨大なテキストを貼り付けることができるように修正できるとは思いませんが、可能であればハングを回避したいと考えています。UITextView がハングする前にテキストをキャッチする方法を提案できますか?

編集: rmaddy のおかげで、これを機能させるために使用したものは次のとおりです。

#import <MobileCoreServices/UTCoreTypes.h>

#define kUITextViewMaximumPaste (65000)

...

- (void)paste:(id)sender {

  UIPasteboard *pb = [UIPasteboard generalPasteboard];
  NSString *type = (NSString *)kUTTypeText;
  if ([pb containsPasteboardTypes:@[type]]) {

    NSString *txt = [pb valueForPasteboardType:type];
    if([txt length] > kUITextViewMaximumPaste) {

      [pb setValue:[txt substringToIndex:kUITextViewMaximumPaste] forPasteboardType:type];
    }
  }

  [super paste:sender];
}
4

1 に答える 1

3

似たようなことをする必要がありましたが、理由は異なります。私がしたことはpaste:UITextView. マットがコメントで提案したように、独自のカスタム サブクラスを作成してメソッドUITextViewを実装するのが最善のpaste:方法です。

- (void)paste:(id)sender {
    if ([[UIPasteboard generalPasteboard] containsPasteboardTypes:[NSArray arrayWithObjects:(NSString *)kUTTypeUTF8PlainText, nil]]) {
        NSString *txt = [[UIPasteboard generalPasteboard] valueForPasteboardType:(NSString *)kUTTypeUTF8PlainText];
        if (txt.length > 65535) {
            // oops - too long
            // either truncate or ignore

            return;
        }
    }

    [super paste:sender];
}

他のタイプのペーストボードも処理する必要がある場合があります。ユーザーが Web ページの一部をコピーして貼り付けると、他のタイプが貼り付けられることがあります。

于 2013-05-06T02:46:12.887 に答える