首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS-11粘贴菜单迅速消失。

iOS-11粘贴菜单迅速消失。
EN

Stack Overflow用户
提问于 2018-02-20 17:14:29
回答 2查看 425关注 0票数 0

我有一个奇怪的错误,我甚至不知道如何开始调试。

当用户想要将某物粘贴到文本字段时,出现的“粘贴”菜单只停留一小部分秒,然后自动消失。这种情况发生在应用程序中的所有UITextField上,无论是在iPhone本身上还是在模拟器中。但是它只发生在iOS 11上,我已经在iOS 10.3.1模拟器上试过了,它在那里工作得很好(菜单保持不动)。

据我所知,我的应用程序中的字段没有什么特别之处。但我也尝试了一个全新的项目,一个只有一个文本字段的应用程序,在那里它工作得很好。所以它一定是我的应用程序中导致它的原因。

任何想法都欢迎。

为了调试目的,我为UIMenuControllerWillHideMenuNotification实现了一个通知处理程序,以查看导致它的原因。下面是发生这种情况时的堆栈跟踪:

代码语言:javascript
复制
#6  0x00000001147598f2 in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#7  0x0000000112c5b6d6 in -[UIMenuController(UICalloutBarDelegateConformance) calloutBar:willStartAnimation:] ()
#8  0x0000000112c39c37 in -[UICalloutBar _fadeAfterCommand:] ()
#9  0x0000000112c12390 in -[UITextSelectionView removeFromSuperview] ()
#10 0x0000000112c13d30 in -[UITextSelectionView updateSelectionRectsIfNeeded] ()
#11 0x0000000112c13c90 in __51-[UITextSelectionView deferredUpdateSelectionRects]_block_invoke ()
#12 0x0000000115d93c07 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#13 0x0000000115d93b5e in __CFRunLoopDoObservers ()
#14 0x0000000115d77fe3 in __CFRunLoopRun ()
#15 0x0000000115d77889 in CFRunLoopRunSpecific ()
#16 0x0000000119dc19c6 in GSEventRunModal ()
#17 0x00000001125b25d6 in UIApplicationMain ()
#18 0x000000010dec3eb4 in main at /Users/rene/Projects/Flyskyhy/Flyskyhy/main.m:17
#19 0x00000001121e7d81 in start ()

编辑:如果我在一行中多次点击文本字段,那么粘贴菜单就会出现,每次都会消失。我现在发现失踪之间的时间总是一个确切的秒数。所以很可能是某些计时器导致了这种行为。

EN

回答 2

Stack Overflow用户

发布于 2018-02-21 15:14:54

如果应用程序在粘贴菜单打开时写入任何UITextField,则该菜单将消失。如果它是写到另一个完全不同的UITextField,甚至在屏幕上不可见的话,情况也是如此。在我的例子中,我在某个地方有一个时钟字段,它每秒钟更新一次。

我已经把窃听器报告给苹果了。它至少存在于iOS版本的V11.2中。前iOS-11版本,如V10.3.1,不显示错误.

作为解决办法,我现在使用下面的UITextField子类而不是UITextField本身。它防止在菜单打开时对字段进行更改。它似乎做了以下工作:

代码语言:javascript
复制
@implementation UITextFieldWrapper {
    bool pasteMenuActive;
    NSString *latestText;
}

- (void) setText:(NSString *)text
{
    if (!pasteMenuActive) {
        [super setText:text];
    } else {
        latestText = text;
    }
}

- (void) updatePasteMenu:(NSNotification *)notification
{
    pasteMenuActive = (notification.name == UIMenuControllerWillShowMenuNotification);
    if (!pasteMenuActive && latestText != nil) {
        self.text = latestText;
        latestText = nil;
    }
}

- (instancetype) initWithFrame:(CGRect)frame
{
    if (!(self = [super initWithFrame:frame])) {
        return nil;
    }
    pasteMenuActive = NO;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatePasteMenu:) name:UIMenuControllerWillShowMenuNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatePasteMenu:) name:UIMenuControllerWillHideMenuNotification object:nil];

    return self;
}

- (void) dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end
票数 0
EN

Stack Overflow用户

发布于 2018-07-13 19:43:33

我也遇到过同样的问题,但是定制的单元格(无论是集视图单元还是表格视图单元)。我已经解决了在viewDidLoad中添加以下内容的问题:

代码语言:javascript
复制
UIMenuController.shared.update()
UIMenuController.shared.isMenuVisible = true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48890734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档