iOS 共享 UIMenuController 可能会缓存 UIMenuItem

Posted

技术标签:

【中文标题】iOS 共享 UIMenuController 可能会缓存 UIMenuItem【英文标题】:iOS shared UIMenuController probably cache UIMenuItem 【发布时间】:2012-10-15 15:15:21 【问题描述】:

我认为下面的图片可以很好地描述这个问题...... https://www.dropbox.com/s/pd1syth3gce6qh7/ios_uimenucontroller.png

我这里也复制了相应的代码部分:

CGPoint point = [sender locationInView:self];
selectedLine = [self lineAtPoint:point];

if(selectedLine) 
    [self becomeFirstResponder];

    UIMenuController *menuController = [[UIMenuController sharedMenuController] retain];
    NSLog(@"count: %d", [[menuController menuItems] count]);
    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"???" action:@selector(delete:)];
    [menuController setMenuItems:[NSArray arrayWithObjects: menuItem, nil]];
    NSLog(@"count: %d", [[menuController menuItems] count]);

    for (UIMenuItem *item in [menuController menuItems]) 
        NSLog(@"%@", [item title]);
    

    [menuController setTargetRect:CGRectMake(point.x, point.y, 2, 2) inView:self];
    [menuController setMenuVisible:YES animated:YES];

    [menuController release];
    [menuItem release];
 else 
    [[UIMenuController sharedMenuController] setMenuVisible:NO animated:YES];


[linesInProcess removeAllObjects];
[self setNeedsDisplay];

控制台输出: 2012-10-15 14:02:16.450 TouchTracker[8808:c07] 点击 2012-10-15 14:02:16.455 TouchTracker[8808:c07] 计数:0 2012-10-15 14:02:16.455 TouchTracker[8808:c07] 计数:1 2012-10-15 14:02:16.456 TouchTracker[8808:c07] ??? 2012-10-15 14:02:16.459 TouchTracker[8808:c07] 线发布


UIMenuController 中只添加了一个 UIMenuItem,运行时在 menuItems NSArray 中只添加了一个,但模拟器中出现了两个菜单项。

如果我点击删除项目,它会向自己发送 delete: 消息。其实之前的标题是“删除”,看起来好像被缓存了。

已经尝试在 iPhone 模拟器上重置内容和设置。还删除了 DerivedData 文件夹的内容……还没有解决方案。也将很快在设备上进行测试。

你有什么想法吗?

在这里您可以找到完整的项目: https://www.dropbox.com/s/wg9ol63aa05px26/TouchTracker.zip

提前致谢, 加博尔·奥罗斯

【问题讨论】:

【参考方案1】:

“删除”是始终可见的系统菜单项。您的自定义菜单项已添加到其中。 来自UIMenuController Class Reference:

删除菜单项已添加到系统菜单项集中。 点击它会调用 UIResponderStandardEditActions 操作方法 delete:,iOS 3.2 也添加了。

【讨论】:

感谢您的提示...实际上解决方案是将以下内容更改为:-(void)delete:(UIMenuItem *)sender 为:-(void)deleteLine:(UIMenuItem *)sender 它看起来像删除名称被系统使用!哎哟! :)

以上是关于iOS 共享 UIMenuController 可能会缓存 UIMenuItem的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 的 UIMenuController 开头附加自定义 UIMenuItems

如何在 iOS 5 中隐藏 UIMenuController

从 UIMenuController 中删除复制、查找和共享

在 WKWebView UIMenuController 中隐藏复制、查找、共享...

iOS UIMenuController

iOS苹果自带UIMenuController