我有一个奇怪的错误,我甚至不知道如何开始调试。
当用户想要将某物粘贴到文本字段时,出现的“粘贴”菜单只停留一小部分秒,然后自动消失。这种情况发生在应用程序中的所有UITextField上,无论是在iPhone本身上还是在模拟器中。但是它只发生在iOS 11上,我已经在iOS 10.3.1模拟器上试过了,它在那里工作得很好(菜单保持不动)。
据我所知,我的应用程序中的字段没有什么特别之处。但我也尝试了一个全新的项目,一个只有一个文本字段的应用程序,在那里它工作得很好。所以它一定是我的应用程序中导致它的原因。
任何想法都欢迎。
为了调试目的,我为UIMenuControllerWillHideMenuNotification实现了一个通知处理程序,以查看导致它的原因。下面是发生这种情况时的堆栈跟踪:
#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 ()编辑:如果我在一行中多次点击文本字段,那么粘贴菜单就会出现,每次都会消失。我现在发现失踪之间的时间总是一个确切的秒数。所以很可能是某些计时器导致了这种行为。
发布于 2018-02-21 15:14:54
如果应用程序在粘贴菜单打开时写入任何UITextField,则该菜单将消失。如果它是写到另一个完全不同的UITextField,甚至在屏幕上不可见的话,情况也是如此。在我的例子中,我在某个地方有一个时钟字段,它每秒钟更新一次。
我已经把窃听器报告给苹果了。它至少存在于iOS版本的V11.2中。前iOS-11版本,如V10.3.1,不显示错误.
作为解决办法,我现在使用下面的UITextField子类而不是UITextField本身。它防止在菜单打开时对字段进行更改。它似乎做了以下工作:
@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发布于 2018-07-13 19:43:33
我也遇到过同样的问题,但是定制的单元格(无论是集视图单元还是表格视图单元)。我已经解决了在viewDidLoad中添加以下内容的问题:
UIMenuController.shared.update()
UIMenuController.shared.isMenuVisible = truehttps://stackoverflow.com/questions/48890734
复制相似问题