【问题标题】:UITextView hangs on very long pastes - how to catch and avoid?UITextView 挂在很长的粘贴上 - 如何捕捉和避免?
【发布时间】:2013-05-06 02:38:33
【问题描述】:

在开发应用程序的过程中,有人向我提交了错误报告 - “无法将长文本粘贴到文本字段中”。果然,它挂在水龙头上的“粘贴”气泡仍然是蓝色的,什么也没发生。我做了一点实验,发现一切都适用于大约 60,000 个字符的文件(并且不会花费很长时间),但 65537 每次都会杀死它。

我进一步试验,发现一些第三方应用程序以及“Notes”应用程序表现出相同的行为。

如果这是 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];
}

【问题讨论】:

  • 附注 - 如果你可以制作一个简单的测试应用程序来复制这个问题,你真的应该在 bugreporter.apple.com 上向 Apple 提交错误报告。
  • 你可以继承 UITextView 并实现paste: 来尝试在它挂起之前捕捉到这种情况。我还没有尝试过,但这是我会尝试的第一件事。
  • 是 - 已提交给 Apple 的错误。

标签: ios ios6 uitextview


【解决方案1】:

我需要做类似的事情,但出于不同的原因。我所做的是在包含UITextView 的自定义视图中实现paste: 方法。正如评论中马特建议的那样,最好创建自己的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];
}

您可能还需要处理其他类型的粘贴板。如果用户复制并粘贴网页的一部分,您可能会看到正在粘贴的其他类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多